hdu 2819 记录路径的二分匹配
2015-05-14 23:03
337 查看
题目大意就是给出一个矩阵,每个格子里面要么是0, 要么是1;是否能够经过交换(交换行或者列)使得主对角线上都是1。
其实就行和列的匹配,左边是行,右边是列,然后如果行列交点是1,那么就可以匹配,看是否为完美匹配,然后输出怎么交换的。开始很蒙的,后来仔细去 想,可以这样理解,想要对角线上都是1,那么我们就可以锁定行,来选择列和它匹配,将选择的列移动到和该行形成对角线上是1的位置,比如和第一行匹配的 列,就要移动要第一列,第二行的,就到第二列。其实就是对第i行,找一个第i个数是1的列和它匹配,然后看是否是最大匹配!
路径的输出其实就是 调整匹配使之都为横线,调整的过程就是要输出的路径,调整列和行是相同的,所以锁定一个方向就行了
Sample Input
2
0 1
1 0
2
1 0
1 0
Sample Output
其实就行和列的匹配,左边是行,右边是列,然后如果行列交点是1,那么就可以匹配,看是否为完美匹配,然后输出怎么交换的。开始很蒙的,后来仔细去 想,可以这样理解,想要对角线上都是1,那么我们就可以锁定行,来选择列和它匹配,将选择的列移动到和该行形成对角线上是1的位置,比如和第一行匹配的 列,就要移动要第一列,第二行的,就到第二列。其实就是对第i行,找一个第i个数是1的列和它匹配,然后看是否是最大匹配!
路径的输出其实就是 调整匹配使之都为横线,调整的过程就是要输出的路径,调整列和行是相同的,所以锁定一个方向就行了
Sample Input
2
0 1
1 0
2
1 0
1 0
Sample Output
1 R 1 2 -1 2015-05-14:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 const int INF=0x3f3f3f3f; const double eps=1e-5; typedef long long ll; #define cl(a) memset(a,0,sizeof(a)) #define ts printf("*****\n"); int n,m,tt; const int MAXN = 510; int a[10000],b[10000]; int uN,vN;//u,v的数目,使用前面必须赋值 int g[MAXN][MAXN];//邻接矩阵 int linker[MAXN]; bool used[MAXN]; bool dfs(int u) { for(int v = 0; v < vN;v++) if(g[u][v] && !used[v]) { used[v] = true; if(linker[v] == -1 || dfs(linker[v])) { linker[v] = u; return true; } } return false; } int hungary() { int res = 0; memset(linker,-1,sizeof(linker)); for(int u = 0;u < uN;u++) { memset(used,false,sizeof(used)); if(dfs(u))res++; } return res; } int main() { int i,j,k; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif while(scanf("%d",&n)!=EOF) { uN=vN=n; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&g[i][j]); int ans=hungary(); if(ans<n) { printf("-1\n"); continue; } int res=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(linker[j]==i) break; } if(i!=j) { a[res]=i,b[res++]=j; int temp=linker[j]; linker[j]=linker[i]; linker[i]=temp; } } printf("%d\n",res); for(i=0;i<res;i++) { printf("C %d %d\n",a[i]+1,b[i]+1); } } }
相关文章推荐
- hdu 2819 Swap(二分匹配+记录路径,好题)
- Swap HDU - 2819(二分匹配+记录路径)
- HDU-2819-Swap [二分匹配][输出路径]
- HDU 2819 Swap (最大二分匹配+输出路径)
- HDU 2819 Swap(记录二分匹配的过程)
- hdu 1507 记录路径的二分匹配 **
- HDU - 2819 Swap (二分匹配+输出路径)
- HDU 2819 (二分匹配)
- hdu2819 Swap(二分匹配)
- HDU 2819 — Swap 二分匹配
- HDU 2819 Swap 二分匹配
- HDU 3861--The King’s Problem【scc缩点构图 && 二分匹配求最小路径覆盖】
- HDU 2819 矩阵交换列使得主对角线都为1 二分匹配
- HDU 2819 — Swap 二分匹配
- hdu 2819(二分匹配)
- hdu 3861 强连通分量缩点+二分匹配求最小路径覆盖
- HDU 2819 swap(二分图匹配并记录路径)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- hdu 2819 二分匹配
- hdu 2819(二分匹配)