飞行员配对方案问题
裸的二分图,匈牙利算法可以水过。
#include<bits/stdc++.h> using namespace std; const int maxn=500; int n,m,p[maxn],match[maxn]; int a[maxn][maxn],to[maxn]; int dfs(int x){ //puts("dfs"); for(int i=m+1;i<=n+m;i++) if(!p[i]&&a[x][i]){ //printf("%d\n",i); p[i]=1; if(!match[i]||dfs(match[i])){ match[i]=x; to[x]=i; return 1; } } return 0; } int main(){ cin>>m>>n; int x,y; while(1){ cin>>x>>y; if(x==-1)break; a[x][y]=a[y][x]=1; } //for(int i=1;i<=n+m;i++){ // for(int j=1;j<=n+m;j++) // printf("%d ",a[i][j]); // puts(""); //} int ans=0; for(int i=1;i<=m;i++){ memset(p,0,sizeof(p)); ans+=dfs(i); } printf("%d\n",ans); for(int i=1;i<=m;i++) if(to[i])printf("%d %d\n",i,to[i]); return 0; }
深深地感到自己的弱小。