hdu 2819 Swap(二分图最大匹配,输出路径)
2016-07-29 08:22
555 查看
Swap
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2712 Accepted Submission(s): 971
Special Judge
Problem 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
2
0 1
1 0
2
1 0
1 0
Sample Output
1
R 1 2
-1
Source
2009 Multi-University Training
Contest 1 - Host by TJU
题意:给一个矩阵,问能否通过交换行和列使得主对角线都是1
思路:可以参考这位大神,写得很详细了。
点击打开链接
最后输出路径我们需要模拟这个交换的过程,比如把第一行跟第三行交换的话,我们记录第一次,然后模拟这个交换的过程
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define N 210 int ma ; int line ,vis ; int n,a ,b ; int can(int t) { for(int i=1; i<=2*n; i++) { if(!vis[i]&&ma[t][i]) { vis[i]=1; if(line[i]==-1||can(line[i])) { line[i]=t; return 1; } } } return 0; } int Maxmatch() { int ans=0; for(int i=1; i<=n; i++) { memset(vis,0,sizeof(vis)); if(can(i)) ans++; else break; } return ans; } int main() { while(~scanf("%d",&n)) { memset(line,-1,sizeof(line)); memset(ma,0,sizeof(ma)); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%d",&ma[i][j]); int ans=Maxmatch(); if(ans!=n) printf("-1\n"); else { int num=0; for(int i=1;i<=n;i++)///模拟交换的过程 { int k; for(k=1;k<=n;k++) if(line[k]==i) break; if(i!=k) { a[num]=i,b[num++]=k; swap(line[i],line[k]);///交换第i列跟第k列 } } printf("%d\n",num); for(int i=0;i<num;i++) printf("C %d %d\n",a[i],b[i]); } } return 0; }
相关文章推荐
- HDU 2819 Swap (最大二分匹配+输出路径)
- hdu 2819 Swap 二分图的最大匹配
- HDU 2819 Swap (二分图-行列匹配+输出解)
- HDU-2819-Swap [二分匹配][输出路径]
- HDU I'm Telling the Truth (二分图最大匹配+字典序最大路径输出(好题))
- HDU - 2819 Swap (二分匹配+输出路径)
- HDOJ 2819 - Swap 二分图最大匹配..并输出方法..
- HDU 2819 Swap 二分图最大匹配
- HDU 2819 Swap(二分图最大匹配)
- hdoj 2819 Swap (最大匹配+输出路径)
- hdu2819 Swap 二分图最大匹配 输出路径
- HDU-2819 swap(二分图最大匹配)
- HDOJ 题目2189 Swap(二分图最大匹配,输出路径)
- HDU 2819 Swap (二分匹配+破输出)
- HDU 2819 Swap(最大匹配问题)
- hdu 2819 Swap(二分匹配+记录路径,好题)
- HDU 2819 Swap (行列匹配+输出解)
- HDU 3729 I'm Telling the Truth(二分图最大匹配+结果输出)
- HDU 2819 Swap (行列匹配+输出解)
- hdu2819 Swap--最大匹配数