题目链接:http://acm.nankai.edu.cn/p2121.html
是个匈牙利算法的题目,开始看了课件不是很懂,同学说了一下,才知道大概意思。
匈牙利算法课件;http://download.csdn.net/detail/u010871244/5951845
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int q[108][108],w[108],r[108],e[108];
int path(int x){ //匈牙利算法实现。。。
for(int y=m+1;y<=n;y++){
if(q[x][y]==1 && e[y]==0){
e[y]=1;
if(r[y]==-1 || path(r[y])){
w[x]=y;
r[y]=x;
return 1;
}
}
}
return 0;
}
int gets(){
int ant=0;
memset(w,-1,sizeof(w));
memset(r,-1,sizeof(r));
for(int i=1;i<=m;i++){ //对每个飞行员一次判断。
if(w[i]==-1){
memset(e,0,sizeof(e));
ant+=path(i);
}
}
return ant;
}
int main(){
int i,j,a,b;
while(~scanf("%d%d",&m,&n)){
memset(q,0,sizeof(q));
while(scanf("%d%d",&a,&b)&& a!=-1 && b!=-1) q[a][b]=1;
if(!gets()) printf("No Solution!\n");
else{
printf("%d\n",gets());
for(i=1;i<=m;i++){
if(w[i] != -1)printf("%d %d\n",i,w[i]);
}
}
}
return 0;
}
路途中。。。。