求助,网络流做法,本地没事,交上去T飞了

P2764 最小路径覆盖问题

@[ycw123](/user/226844) AC代码 ``` #include<bits/stdc++.h> #define ll long long #define INF 0x3f3f3f3f using namespace std; const int N = 1e5 + 10; int n, m, s, t, h[N], cnt, dep[N], cur[N], to[N], tag[N]; struct node { int v, w, nt; } no[N]; void add(int u, int v, int w) { no[cnt] = node{v, w, h[u]}; h[u] = cnt++; } int bfs() { queue<int> q; memset(dep, 0, sizeof dep); dep[s] = 1; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); for(int i = h[u]; ~i; i = no[i].nt) { int v = no[i].v; if(!dep[v] && no[i].w > 0) { dep[v] = dep[u] + 1; q.push(v); } } } return dep[t] > 0; } int dfs(int u, int flow) { if(u == t) return flow; for(int i = cur[u]; ~i; i = no[i].nt) { int v = no[i].v; if(dep[v] == dep[u] + 1 && no[i].w > 0) { int res = dfs(v, min(flow, no[i].w)); if(res > 0) { no[i].w -= res; no[i ^ 1].w += res; if(u != s && v != t) to[u] = v;//记录路径 if(u != s)//记录本节点非路径的根节点 tag[v - n] = 1; return res; } } } return 0; } int dinic() { int res = 0; while(bfs()) { for(int i = 0; i <= cnt; i++) cur[i] = h[i]; while(int d = dfs(s, INF)) res += d; } for(int i = 1; i <= n; i++) { if(!tag[i]) { int u = i; printf("%d ", u); while(to[u] && to[u] != t) { printf("%d ", to[u] - n); u = to[u] - n; } puts(""); } } return res; } int main() { //freopen("1.in", "r", stdin); memset(h, -1, sizeof h); scanf("%d%d", &n, &m); t = 2 * n + 1; for(int i = 1; i <= n; i++) { add(s, i, 1), add(i, s, 0); add(i + n, t, 1), add(t, i + n, 0); } for(int u, v, i = 1; i <= m; i++) { scanf("%d%d", &u, &v); add(u, v + n, 1), add(n + v, u, 0); } printf("%d\n", n - dinic()); return 0; }
by WANG_ZHENG_MING @ 2022-08-03 10:43:38


找到问题了,dfs没有`return 0;`
by ycw123 @ 2022-08-22 09:09:08


|