Swap(hdu2819,最大匹配+记录路径)
2013-08-19 09:05
381 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2819
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29327#problem/B
B - Swap
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
解析:
题意: 给出一个矩阵,任意两行可以交换,任意两列可以交换,问如何交换是的矩阵的对角线全为1,如果可以达到目标则输出步骤,否则输出-1.
思路:
转化为行和列的最大匹配。
如果最大匹配数小于n则说明不可达到目标
否则记录路径并输出
276 KB 78 ms C++ 1298 B
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29327#problem/B
B - Swap
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
解析:
题意: 给出一个矩阵,任意两行可以交换,任意两列可以交换,问如何交换是的矩阵的对角线全为1,如果可以达到目标则输出步骤,否则输出-1.
思路:
转化为行和列的最大匹配。
如果最大匹配数小于n则说明不可达到目标
否则记录路径并输出
276 KB 78 ms C++ 1298 B
#include<string.h> #include<stdio.h> #include<algorithm> #include <iostream> using namespace std; const int maxn=100+10; int n; int vis[maxn],result[maxn]; int map[maxn][maxn]; struct node { int r; int c; }nd[maxn]; int find(int a) { for(int i=1;i<=n;i++) { if(map[a][i]&&!vis[i]) { vis[i]=1; if(result[i]==0||find(result[i])) { result[i]=a; return 1; } } } return 0; } int main() {int i,k,j,t; while(scanf("%d",&n)!=EOF) {int u,v; //memset(map,0,sizeof(map)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) scanf("%d",&map[i][j]); } int ans=0; memset(result,0,sizeof(result)); for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(find(i)) {ans++; } } if(ans<n) { printf("-1\n"); continue; } k=0; int t; for(i=1;i<=n;i++) { if(result[i]!=i) { for(j=i+1;j<=n;j++) { if(result[j]==i) { nd[k].r=i; nd[k++].c=j; t=result[i];//注意这里交换的是列 result[i]=result[j]; result[j]=t; } } } } printf("%d\n",k); for(i=0;i<k;i++) { printf("C %d %d\n",nd[i].r,nd[i].c); } } return 0; }
相关文章推荐
- hdu2819 Swap 二分图最大匹配 输出路径
- HDU2819 Swap 最大匹配
- POJ 1719 二分图最大匹配(记录路径)
- hdu 2819 Swap(二分匹配+记录路径,好题)
- Swap---hdu2819(最大匹配)
- hdu 2819 Swap(二分图最大匹配,输出路径)
- hdoj 2819 Swap (最大匹配+输出路径)
- HDOJ 题目2189 Swap(二分图最大匹配,输出路径)
- HDU 2819 Swap (最大二分匹配+输出路径)
- 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)
- [swust1736]飞行员配对方案问题(最大流,记录路径)
- HDU 1151 Air Raid(最小路径覆盖 = 顶点数 - 最大匹配数)
- poj2060 Taxi Cab Scheme 最小路径覆盖=顶点数-最大匹配数
- DAG最小路径覆盖与二分图最大匹配
- poj 2594 Treasure Exploration(最小路径覆盖->最大匹配)
- 洛谷 P2764(最小路径覆盖=节点数-最大匹配)
- 【HDU1507】【最大匹配输出路径match数组】
- Antenna Placement poj3020(二分图最大匹配/最小路径覆盖)
- HDU-2255(记录km算法的板子,km求最大权,最小权匹配)
- 二分图最大匹配,最小路径覆盖,最小点覆盖,最大独立集,最小边覆盖与建图方法