HDU2819:Swap(二分图匹配)
Swap
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4932 Accepted Submission(s): 1836
Special Judge
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819
Description:
Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. Can you find a way to make all the diagonal entries equal to 1?
Input:
There are several test cases in the input. The first line of each test case is an integer N (1 <= N <= 100). Then N lines follow, each contains N numbers (0 or 1), separating by space, indicating the N*N matrix.
Output:
For each test case, the first line contain the number of swaps M. Then M lines follow, whose format is “R a b” or “C a b”, indicating swapping the row a and row b, or swapping the column a and column b. (1 <= a, b <= N). Any correct answer will be accepted, but M should be more than 1000.
If it is impossible to make all the diagonal entries equal to 1, output only one one containing “-1”.
Sample Input:
R 1 2
-1
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int N = 105 ; int map[N][N],link[N][N],match[N],check[N],r[N],a[N],b[N]; int n,ans,tot; inline void init(){ memset(map,0,sizeof(map));memset(link,0,sizeof(link)); memset(match,-1,sizeof(match));ans=0;tot=0; memset(a,0,sizeof(a));memset(b,0,sizeof(b)); } inline int dfs(int x){ for(int i=1;i<=n;i++){ if(link[x][i] && !check[i]){ check[i]=1; if(match[i]==-1 || dfs(match[i])){ match[i]=x; return 1; } } } return 0; } inline void Swap(){ for(int i=1;i<=n;i++){ if(match[i]!=i){ a[++tot]=i;b[tot]=match[i]; for(int j=1;j<=n;j++){ if(match[j]==i){ swap(match[i],match[j]); break ; } } } } } int main(){ while(scanf("%d",&n)!=EOF){ init(); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&map[i][j]); if(map[i][j]) link[i][j]=1; } } for(int i=1;i<=n;i++){ memset(check,0,sizeof(check)); if(dfs(i)) ans++; } if(ans!=n){ puts("-1");continue ; } Swap(); printf("%d\n",tot); for(int i=1;i<=tot;i++) printf("R %d %d\n",a[i],b[i]); } return 0; }
重要的是自信,一旦有了自信,人就会赢得一切。