hdu2819(2009多校第一场) 二分图匹配
将给定01矩阵进行任意行列交换使主对角线全为1==
行列建图,如果完全匹配则必然可以,继而使用选择排序思想来只交换行(或者列)
1 #include<stdio.h> 2 #include<string.h> 3 struct dian{ 4 int x,y; 5 }a[1005]; 6 int n,g[105][105],yy[105],link[105]; 7 int dfs(int u) 8 { 9 for (int i=1;i<=n;i++) 10 if (g[u][i]&&yy[i]==0) 11 { 12 yy[i]=1; 13 if (link[i]==0||dfs(link[i])) 14 { 15 link[i]=u; 16 return 1; 17 } 18 } 19 return 0; 20 } 21 int main() 22 { 23 int i,j,x,y,ans,cnt; 24 while (~scanf("%d",&n)) 25 { 26 memset(g,0,sizeof(g)); 27 memset(link,0,sizeof(link)); 28 for (i=1;i<=n;i++) 29 for (j=1;j<=n;j++) 30 { 31 scanf("%d",&x); 32 if (x) g[i][j]=1; 33 } 34 ans=0; 35 for (i=1;i<=n;i++) 36 { 37 memset(yy,0,sizeof(yy)); 38 if (dfs(i)) ans++; 39 } 40 if (ans<n) { printf("-1\n"); continue;} 41 cnt=0; 42 for (i=1;i<=n;i++) 43 if (link[i]!=i) 44 for (j=i+1;j<=n;j++) 45 if (link[j]==i) 46 { 47 a[++cnt].x=i; 48 a[cnt].y=j; 49 link[j]=link[i]; 50 } 51 printf("%d\n",cnt); 52 for (i=1;i<=cnt;i++) 53 printf("C %d %d\n",a[i].x,a[i].y); 54 } 55 }