https://atcoder.jp/contests/abc373/tasks
D:
搞不清楚dfs还是bfs真的是有点太抽象(一直在想bfs)。每个点只要访问过就不再访问第二次直接dfs可过。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define pii pair<int,int>
#define mkp make_pair
const int maxn=2e5+10;
vector<pii>E[maxn],G[maxn];
bool vis[maxn];
int dis[maxn];
void dfs(int x){
if(vis[x])return;
vis[x]=1;
for(auto i:E[x]){
if(!vis[i.first]){
dis[i.first]=dis[x]+i.second;
dfs(i.first);
}
}
for(auto i:G[x]){
if(!vis[i.first]){
dis[i.first]=dis[x]-i.second;
dfs(i.first);
}
}
return;
}
signed main(){
int n,m,k;
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;cin>>u>>v>>w;
E[u].pb(mkp(v,w));
G[v].pb(mkp(u,w));
}
for(int i=1;i<=n;i++)if(!vis[i])dfs(i);
for(int i=1;i<=n;i++)cout<<dis[i]<<endl;
}
E:
两个二分暴力可过。