思路讲解:
关于图论与dfs在图上的搜索
这道题的意思是,这个题让你给n个顶点赋一个值,然后要满足这m条边的关系,即 xvj−xuj=wj
其实还应满足 xuj-xvj=-wj,两者应该是同时成立的,其实这道题就是用深搜就可以了,因为每一个点只访问一次,然后要访问它的所有邻居,直到再也不能到达新的顶点为止;
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
struct edge
{
int y,w;
};
int n,m;
vector<edge> G[N];
bool vis[N];
long long dis[N];
void dfs(int x,long long d)
{
vis[x]=true;
dis[x]=d;
for(int i=0;i<G[x].size();i++)
{
int y=G[x][i].y;
int w=G[x][i].w;
if(!vis[y]) dfs(y,d+w);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
G[u].push_back((edge){v,w});
G[v].push_back((edge){u,-w});
}
for(int i=1;i<=n;i++)
{
if(!vis[i]) dfs(i,0);
}
for(int i=1;i<=n;i++)
{
cout<<dis[i]<<" ";
}
cout<<endl;
return 0;
}