一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
269C - Flawed Flow
二、解题报告
1、思路分析
考虑源点相连的边的方向是确定的,因为流量是从源点往外流的
我们设cap[u] 为 和u相连边的容量和,显然入边容量要和出边容量相等,我们不妨将cap 都 除以2
我们从源点开始往外更新流量,对所有邻接点 容量和减去相连边的容量
源点更新后一定存在某个点剩余容量为0,即其剩下的边的方向都是从该点出发的
由于原图无环,我们不断dfs一定能够不断地找到这样地点,知道更新到汇点
2、复杂度
时间复杂度: O(N + M)空间复杂度:O(N + M)
3、代码详解
#include <bits/stdc++.h>
// #include <ranges>
// #define DEBUG
using i64 = long long;
using u32 = unsigned;
using u64 = unsigned long long;
constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
constexpr double eps = 1e-9;
constexpr int N = 1005;
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<std::vector<std::array<int, 3>>> adj(n);
std::vector<int> cap(n);
for (int i = 1, u, v, c; i <= m; ++ i) {
std::cin >> u >> v >> c;
-- u, -- v;
adj[u].push_back({v, c, i});
adj[v].push_back({u, c, -i});
cap[u] += c, cap[v] += c;
}
for (auto& x : cap)
x /= 2;
std::vector<int> ans(m, -1);
auto dfs = [&](auto&& self, int u) -> void {
for (auto& [v, c, i] : adj[u]) {
if (~ans[abs(i) - 1]) continue;
ans[abs(i) - 1] = i > 0 ? 0 : 1;
if (!(cap[v] -= c)) {
if (v + 1 != n)
self(self, v);
}
}
};
dfs(dfs, 0);
for (int x : ans)
std::cout << x << '\n';
}
auto FIO = []{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
} ();
int main() {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int t = 1;
// std::cin >> t;
while (t --)
solve();
return 0;
}