可以发现一个性质:对于图的每个连通分量,一旦在其中任何顶点上的值固定,则所有写入的值都是确定的。
我们可以逐个 DFS 每个连通分量,按照题目的要求给每个点赋值,初始搜索的点值设成 \(0\) 即可。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
vector<pair<int,int>> g[200010];
bool vi[200010];
int ans[200010];
void sear(int o){
vi[o]=1;
for(auto &[v,w]:g[o]){
if(!vi[v]){
vi[v]=1;
ans[v]=ans[o]+w;
sear(v);
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,-w});
}
for(int i=1;i<=n;i++){
if(vi[i]) continue;
sear(i);
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<' ';
}
}
标签:vi,ABC373D,题解,back,200010,int,ans,Hidden
From: https://www.cnblogs.com/cly312/p/18444925