为什么不能这样输出方案
查看原帖
为什么不能这样输出方案
390770
D2T1xubiaoshi楼主2023/7/9 20:39
//P2764
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1e5;
int n, m, hd[N], ln[N], eg[N], nx[N], tot, dep[N], now[N];

void adg(int x, int y){
	eg[++tot] = y;
	ln[tot] = 1;
	nx[tot] = hd[x];
	hd[x] = tot;
	eg[++tot] = x;
	ln[tot] = 0;
	nx[tot] = hd[y];
	hd[y] = tot;
}

bool bfs(int s, int t){
	memset(dep, 0, sizeof(dep));
	memcpy(now, hd, sizeof(hd));
	queue<int> q;
	dep[s] = 1;
	q.push(s);
	while(!q.empty()){
		int x = q.front();
		q.pop();
		for(int i = hd[x]; i; i = nx[i]){
			int y = eg[i], z = ln[i];
			if(z && !dep[y]){
				dep[y] = dep[x] + 1;
				q.push(y);
				if(y == t){
					return true;
				}
			}
		}
	}
	return false;
}
int dfs(int x, int t, int fl){
	if(x == t){
		return fl;
	}
	int rs = fl;
	for(int i = now[x]; i; i = nx[i]){
		int y = eg[i], z = ln[i];
		if(z && dep[y] == dep[x] + 1){
			int k = dfs(y, t, min(z, rs));
			if(!k){
				dep[y] = 0;
			}
			ln[i] -= k;
			ln[i^1] += k;
			rs -= k;
		}
	}
	return fl - rs;
}

map<pair<int, int>, int> mp;
vector<int> g[N];
int ind[N], vis[N];

void solve(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++ i){
		adg(0, i);
		adg(i+n, n+n+1);
	}
	for(int i = 1; i <= m; ++ i){
		int x, y;
		scanf("%d%d", &x, &y);
		mp[make_pair(x, y)] = tot + 1;
		adg(x, y+n);
	}
	int mf = 0, tmp;
	while(bfs(0, n+n+1)){
		while(tmp = dfs(0, n+n+1, 1e9)){
			mf += tmp;
		}
	}
	for(int i = 1; i <= n; ++ i){
		for(int j = 1; j <= n; ++ j){
			int v = mp[make_pair(i, j)];
			if(v && !ln[v]){
				g[i].push_back(j);
				++ ind[j];
			}
		}
	}
	for(int i = 1; i <= n; ++ i){
		int p = i, flg = 0;
		while(!vis[p] && !ind[p]){
			flg = 1;
			printf("%d ", p);
			vis[p] = 1;
			int tp = 0;
			for(int j : g[p]){
				-- ind[j];
				if(!ind[j]){
					tp = j;
				}
			}
			if(!tp){
				break;
			}
			p = tp;
		}
		if(flg) puts("");
	}
	printf("%d", n - mf);




}

int main(){
	solve();
	return 0;
}

//qwq

把权值改变的边提出来变成一张图 然后在图上拓扑

2023/7/9 20:39
加载中...