HDU 2819 (二分匹配)
2014-04-20 11:32
281 查看
题意:给你n*n的矩阵(0或1),问是否能通过,行和列的交换,使主对角线都为1;
最后输出交换的方法。
最后输出交换的方法。
#include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<cmath> #include<iostream> #include <queue> #include <stack> #include<algorithm> #include<set> using namespace std; #define INF 1e8 #define inf -0x3f3f3f3f #define eps 1e-8 #define ll __int64 #define maxn 100+50 #define mol 100007 int vis[maxn],ans[maxn],g[maxn][maxn]; int k,n,m,sum; int dfs(int id) { for(int i=1;i<=n;i++) { if(!vis[i]&&g[id][i]) { vis[i]=1; if(ans[i]==0||dfs(ans[i])) { ans[i]=id; return 1; } } } return 0; } void match() { sum=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) sum++; else break; } } struct node { int c,r; }sw[maxn]; int main() { int i,j; int t; while(~scanf("%d",&n)) { memset(g,0,sizeof(g)); memset(ans,0,sizeof(ans)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&g[i][j]); } } match(); if(sum<n) { printf("-1\n"); continue; } int cnt=0; for(i=1;i<=n;i++) { if(ans[i]!=i) { for(j=i+1;j<=n;j++) { if(ans[j]==i) { sw[cnt].r=i; sw[cnt].c=j; cnt++; swap(ans[i],ans[j]); break; } } } } printf("%d\n",cnt); for(i=0;i<cnt;i++) { printf("C %d %d\n",sw[i].r,sw[i].c); } } return 0; }
相关文章推荐
- hdu 2819(二分匹配)
- hdu 2819 二分匹配
- HDU 2819 — Swap 二分匹配
- HDU 2819 Swap(记录二分匹配的过程)
- HDU 2819 矩阵 最大二分匹配
- hdu 2819 记录路径的二分匹配
- HDU 2819 Swap 二分匹配
- HDU 2819 Swap (二分匹配+破输出)
- HDU 2819 矩阵交换列使得主对角线都为1 二分匹配
- hdu2819 Swap(二分匹配)
- HDU 2819 — Swap 二分匹配
- hdu 2819 Swap【完美二分匹配】
- hdu 2819(二分匹配)
- hdu 2819 Swap(二分匹配+记录路径,好题)
- HDU - 2819 Swap (二分匹配+输出路径)
- HDU-2819-Swap [二分匹配][输出路径]
- hdu-2819 Swap (二分匹配)
- HDU 2819 二分匹配
- HDU2819【二分匹配与矩阵的秩】
- HDU 2819 Swap (最大二分匹配+输出路径)