Swap(hdu2819,最大匹配+记录路径)
来源:互联网 发布:淘宝拍卖房产过户流程 编辑:程序博客网 时间:2024/05/23 19:16
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
#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;}
- Swap(hdu2819,最大匹配+记录路径)
- HDU2819 Swap 最大匹配
- hdu2819 Swap--最大匹配数
- hdu2819 Swap 二分图最大匹配 输出路径
- HDU2819 Swap(二分图匹配匈牙利算法+记录路径)
- hdu2819 Swap(二分匹配)
- HDU2819 Swap (二分图匹配)
- hdu2819 swap(二分图匹配)
- 【图论】【二分图匹配】[HDU2819]Swap
- hdu2819-Swap(二分图匹配,思路)
- hdu2819 Swap
- HDU2819:Swap
- hdu2819 Swap
- 【HDU2819】Swap
- HDU2819-Swap
- Hdu2819 Swap
- HDU2819 Swap
- hdoj 2819 Swap (最大匹配+输出路径)
- 分页代码
- C++内存泄露解析
- Asteroids(poj 3041,二分图最大匹配)
- 软件项目流程管理
- 态度
- Swap(hdu2819,最大匹配+记录路径)
- C和C++语言中字符串的声明
- 十四条关于移动端产品设计的原则
- android:layout_gravity 和 android:gravity 的区别
- IGG成Google Play美国市场收入十强公司
- 划分类的依据
- hdu4435 charge-station
- Tour(hdu 3488,KM+拆点)
- android中进行https连接的方式