ABC373 D题 题解

一个朴素的想法是依次满足各个条件,很显然过不了,例如:

3 2
1 2 1
3 2 2

原因很显然,一个点确定后再进行操作会导致前面的不合法,因为保证有解,易得它是有向无环图,所以可以拓扑排序(存疑),但这只蒟蒻写挂了,所以这篇题解主要介绍 DFS 解法。

这个比较简单,我画个图: 为了方便 DFS,我们建上反边,注意取负边权: 然后对于每个点用朴素 DFS 并附上点权就行了(也就是用 DFS 确定先后顺序)。

Code:

#include<bits/stdc++.h>
using namespace std;
long long n, m, a[200005], vis[200005], cnt;
vector<pair<long long, long long> > g[200005];
void dfs(long long u){
	vis[u] = 1;
	for(long long i = 0; i < g[u].size(); i ++){
		a[g[u][i].first] = a[u] + g[u][i].second;
		if(!vis[g[u][i].first]) dfs(g[u][i].first);//警示后人,别写成 i 了
	}
}
int main(){
	cin >> n >> m;
	for(long long i = 1; i <= m; i ++){
		long long u, v, w;
		cin >> u >> v >> w;
		g[u].push_back({v, w});
		g[v].push_back({u, -w});
	}
	for(long long i = 1; i <= n; i ++){
		if(!vis[i]) dfs(i);
	}
	for(long long i = 1; i <= n; i ++) cout << a[i] << " ";
	return 0;
}

愉快 AC我不会告诉你我是最后几分钟才找出错的

posted on 2024-09-29 18:23  zhangzirui66  阅读(8)  评论(0)    收藏  举报  来源

导航