社区讨论

73分TLE求条

P6822[PA 2012 Finals] Tax参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjtlcxo
此快照首次捕获于
2025/11/04 08:17
4 个月前
此快照最后确认于
2025/11/04 08:17
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s=0,t=200005;
int cnt=0;
vector<int> ne[100005];//原点->现边 
bool flag[200010];
int ans[200010];
struct EDGE{
	int node;
	int val;
};
struct EN{
	int num;
	int a,b;
}en[200010];//原边->现点 
struct TNODE{
	int node;
	int ans;
	int fa;
	bool operator<(const TNODE& other)const{
		return ans>other.ans;
	}
};
void dij(){
	memset(ans,0x3f3f3f,sizeof ans);
	priority_queue<TNODE> dcl;
	dcl.push({s,0,en[s].a});
	ans[s]=0;
	while(!dcl.empty()){
		int node=dcl.top().node,tans=dcl.top().ans;
		int fa=dcl.top().fa;
		int a=en[node].a,b=en[node].b;
		dcl.pop();
		if(flag[node])continue;
		flag[node]=1;
		if(node==t)break;
		if(fa!=a or node==s){
			for(int j=0;j<ne[a].size();j++){
				if(ne[a][j]==node)continue;
				if(max(en[ne[a][j]].num,en[node].num)+tans<ans[ne[a][j]]){
					ans[ne[a][j]]=max(en[ne[a][j]].num,en[node].num)+tans;
					dcl.push({ne[a][j],ans[ne[a][j]],a});
				}
			}
		}
		if(fa!=b){
			for(int j=0;j<ne[b].size();j++){
				if(ne[b][j]==node)continue;
				if(max(en[ne[b][j]].num,en[node].num)+tans<ans[ne[b][j]]){
					ans[ne[b][j]]=max(en[ne[b][j]].num,en[node].num)+tans;
					dcl.push({ne[b][j],ans[ne[b][j]],b});
				}
			}
		}
		
	}
	return;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
	cin>>n>>m;
	ne[1].push_back(s);
    en[s].num=0;
    en[s].a=1;
	en[s].b=1; 
    ne[n].push_back(t);
    en[t].num=0;
    en[t].a=n;
    en[t].b=n;
	for(int i=1,a,b,c;i<=m;i++){
		cin>>a>>b>>c;
		en[++cnt].num=c;
		ne[a].push_back(cnt);
		en[cnt].a=a;
		//原a点的所有边化点相连
		ne[b].push_back(cnt);
		en[cnt].b=b;
		//原b点的所有边化点相连
	}
	dij();//最短路
	cout<<ans[t];
    return 0;
}
感谢大佬

回复

0 条回复,欢迎继续交流。

正在加载回复...