简单建图,建超源超汇
最后打印图
链接
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 550;
const int maxm = maxn * 50;
int n, m;
int to[maxm], nxt[maxm], w[maxm];
int fst[maxn], cnt, cur[maxn];
int s, t, d[maxn];
void init() {
memset(fst, -1, sizeof(fst));
cnt = 0;
}
void addedge(int u, int v, int val) {
to[cnt] = v;
w[cnt] = val;
nxt[cnt] = fst[u];
fst[u] = cnt++;
to[cnt] = u;
w[cnt] = 0;
nxt[cnt] = fst[v];
fst[v] = cnt++;
}
int bfs() {
queue<int> Q;
memset(d, 0, sizeof(d));
d[s] = 1;
Q.push(s);
while (!Q.empty()) {
int u = Q.front();
Q.pop();
for (int i = fst[u]; ~i; i = nxt[i]) {//因为初始是-1
int v = to[i];
if (w[i] > 0 && d[v] == 0) {
d[v] = d[u] + 1;
if (v == t) return 1;
Q.push(v);
}
}
}
return d[t] != 0;
}
int dfs(int u, int flow) {
if (u == t)
return flow;
int ans = 0, x = 0;
for (int i = cur[u]; ~i; i = nxt[i]) {
int v = to[i];
if (w[i]>0 && d[v] == d[u]+1){
x = dfs(v,min(flow-ans,w[i]));
w[i]-=x;
w[i^1]+=x;
if (w[i]) cur[u] = i;
ans+=x;
if (ans == flow) return flow;
}
}
if (ans == 0)d[u] =0;
return ans;
}
int dinic(int n){
int ans = 0;
while (bfs()){
for (int i=0;i<n;i++)
cur[i] = fst[i];
ans+=dfs(s,INF);
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> m >> n;
init();
s = 0;t= n+1;
for(int i =1;i<=m;i++){
addedge(s,i,1);
}
for (int i=m+1;i<=n;i++)
addedge(i,t,1);
while (1){
int x,y;
cin >> x >> y;
if (x == -1 && y == -1) break;
addedge(x,y,1);
}
int ans = dinic(t);
cout << ans << endl;
if (ans == 0){
cout << "No Solution!\n";
return 0;
}
for (int i=m+1;i<=n;i++)
for (int j = fst[i];~j;j = nxt[j]){
if (to[j]!=t && w[j] == 1) cout << to[j] <<' '<< i<<endl;
}
}