社区讨论
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 条回复,欢迎继续交流。
正在加载回复...