dinic WA on #6#7#10#11 求调
查看原帖
dinic WA on #6#7#10#11 求调
1401495
Wangchenxi2013楼主2025/8/3 19:19
#include<bits/stdc++.h>
//#pragma GCC optimize("-Ofast")
using namespace std;
//#define int long long
const int N = 5e5+10;
struct node{
	int v,w,nxt,flw;
}e[N];
int tot,head[N];
int n,m,s,t;
int now[N],dep[N],vis[N],flg[501][501];
long long ans=0;
void init(){
	for(int i = 0;i <= N-1;i++)head[i] = -1;
}
void add(int u,int v,int w){
	// e[++tot].u = u;
	e[tot].v = v;
	e[tot].w = w;
	e[tot].nxt = head[u];
	e[tot].flw = 0;
	// e[++tot].u = v;
	head[u] = tot++;
	e[tot].v = u;
	e[tot].w = 0;
	e[tot].nxt = head[v];
	e[tot].flw = 0;
	head[v] = tot++;
	
}
bool bfs(){
	queue<int> q;
	for(int i=0;i<=(n+m+1);i++)dep[i] = 0;
	dep[s] = 1;
	q.push(s);
	while(q.size()){
		int u = q.front();
//		cout << u << endl;
		q.pop();
		for(int i = head[u];~i;i = e[i].nxt){
			int v = e[i].v;
			if((!dep[v]) && (e[i].w > e[i].flw)){
//				cout << e[i].w << ' ' << e[i].flw << endl;
				dep[v] = dep[u] + 1;
				now[i]=head[i];
				q.push(v);
//				if(v == t)return 1;
			}
		}
	}
	return dep[t];
}
int dfs(int u,int flow){
	if(u == t || (!flow))return flow;
	int res = 0,d;
//	cout << u << ":\n";
	for(int i = now[u];~i;i = e[i].nxt){
		now[u] = i;
		int v = e[i].v;
//		cout << v << ' ';
		if(dep[v] == dep[u] + 1 && e[i].w && (d = dfs(v,min(flow - res,e[i].w-e[i].flw)))){
			if(d == 0) return 0;
//			cout << d << endl; 
			res += d;
			e[i].flw += d;
			e[i^1].flw -= d;
			if(res == flow)return flow;
		}
	}
//	cout << endl;
	return res;
}
void dinic(){
	while(bfs()){
		for(int i = 0;i < tot;i++){
			now[i] = head[i];
//			cout<<e[i].flw<<' '<<e[i].v<< ' ' << e[i].w << endl;
		}
		ans += dfs(s,1e5);
	}
	return ;
}
void in(){
	int e; 
	int x;
	cin >> m >> x;
	n = x - m;int u,v;
	cin >> u >> v;
	while(u!=-1&&v!=-1){
		add(u,v,1);
		add(v,u,1);
		cin >> u >> v;
		
//		add(v + n,u,1);
	}
	for(int i = 1;i <= m;i++){
		add(0,i,1);
//		add(i,0,1);
	}
	for(int i = m + 1;i <= m + n;i++){
		add(i,n + m + 1,1);
//		add(n + m + 1,i,1);
	}
	s = 0;
	t = n + m + 1;
//	bfs();
//	for(int i = 1;i <= n + m + 1;i++){
//		cout << dep[i] << ' ';
//	}
//	cout << "\n";
	return ;
}
void out(){
	cout << ans << endl;
	for(int i = 1;i < tot;i+=2){
        if(e[i].v!=s&&e[i^1].v!=s)if(e[i].v!=t&&e[i^1].v!=t)if(e[i^1].flw!=0){
        	cout << e[i].v << ' ' << e[i^1].v << endl;
		}
	}
}
void work(){in();dinic();out();}
signed main(){init();work();}
2025/8/3 19:19
加载中...