[codevs 1232] 飞行员配对方案问题
题解:
做法一:二分图最大匹配。
做法二:用网络流求解二分图最大匹配...
但是都卡在输出路径上面。。。纠结要不要直接交数据,反正我有。。。
代码(未AC):
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100 + 10;
int x[maxn], y[maxn], m, n;
bool vis[maxn], g[maxn][maxn];
int dfs(int u) {
for(int v = n; v >= 1; v--)
if(g[u][v] && !vis[v]) {
vis[v] = true;
if(y[v] == -1 || dfs(y[v])) {
x[u] = v;
y[v] = u;
return 1;
}
}
return 0;
}
int main() {
int u, v, ans = 0;
scanf("%d%d", &m, &n);
while(scanf("%d%d",&u,&v), u != -1 && v != -1)
g[u][v] = g[v][u] = true;
memset(x, -1, sizeof(x));
memset(y, -1, sizeof(y));
for(int i = 1; i <= m; i++) {
memset(vis, 0, sizeof(vis));
ans += dfs(i);
}
if(ans) {
printf("%d\n", ans);
for(int i = 1; i <= m; i++) if(x[i] > 0) printf("%d %d\n", i, x[i]);
}
else printf("No Solution!");
}