RT。WA32个点。
赛时想的诡异思路:
每次取编号最小的,如果没赋值就赋值为0,然后将取到最小值的这条边搞一下。
取最小的可以用优先队列维护。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int N=5e5+7;
const int inf=9e18;
int n,m,a[N];
struct ask{
int u,v,w;
inline bool operator <(const ask &X)const{return min(u,v)>min(X.u,X.v);}
};
priority_queue<ask>q;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)a[i]=inf;
for(int i=1;i<=m;i++){
int u,v,w;cin>>u>>v>>w;
q.push({u,v,w});
}
while(1){
if(q.empty())break;
int u=q.top().u,v=q.top().v,w=q.top().w;
q.pop();
if(a[min(u,v)]==inf)a[min(u,v)]=0;
if(min(u,v)==u)a[v]=a[u]+w;
else a[u]=a[v]-w;
}
for(int i=1;i<=n;i++){
if(a[i]==inf)cout<<0<<" ";
else cout<<a[i]<<" ";
}
}