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) 收藏 举报 来源