hdu 2819(二分匹配)
2013-06-03 09:51
489 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819
思路:有矛盾关系的可以考虑二分匹配= =只交换行或者只交换列都能得到目的,如果不能,就输出-1。建图的时候应该建有向图。
View Code
思路:有矛盾关系的可以考虑二分匹配= =只交换行或者只交换列都能得到目的,如果不能,就输出-1。建图的时候应该建有向图。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath>[ using namespace std; #define MAXN 111 int n,x; int map[MAXN][MAXN]; bool mark[MAXN]; int row[MAXN]; int ly[MAXN]; bool dfs(int u){ for(int i=1;i<=n;i++){ if(map[u][i]&&!mark[i]){ mark[i]=true; if(ly[i]==-1||dfs(ly[i])){ ly[i]=u; return true; } } } return false; } bool MaxMatch(){ memset(ly,-1,sizeof(ly)); for(int i=1;i<=n;i++){ memset(mark,false,sizeof(mark)); if(!dfs(i))return false; } return true; } int main(){ // freopen("1.txt","r",stdin); while(~scanf("%d",&n)){ memset(map,0,sizeof(map)); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&x); map[j][i]=x; } } if(!MaxMatch()){ puts("-1");continue; } for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ if(ly[j]==i){ row[i]=j;swap(ly[j],ly[i]);break; } } } printf("%d\n",n); for(int i=1;i<=n;i++) printf("R %d %d\n",i,row[i]); } return 0; }
View Code
相关文章推荐
- HDU 2819 Swap (最大二分匹配+输出路径)
- HDU 2819 (二分匹配)
- hdu 2819 二分匹配
- hdu 2819(二分匹配)
- HDU 2819 — Swap 二分匹配
- HDU 2819 Swap(记录二分匹配的过程)
- HDU 2819 矩阵 最大二分匹配
- hdu 2819 记录路径的二分匹配
- HDU 2819 Swap 二分匹配
- HDU 2819 Swap (二分匹配+破输出)
- HDU 2819 矩阵交换列使得主对角线都为1 二分匹配
- HDU 2819 — Swap 二分匹配
- hdu2819 Swap(二分匹配)
- hdu 2819 Swap【完美二分匹配】
- hdu 2819 Swap(二分匹配+记录路径,好题)
- HDU - 2819 Swap (二分匹配+输出路径)
- hdu-2819 Swap (二分匹配)
- HDU-2819-Swap [二分匹配][输出路径]
- HDU 2819 二分匹配
- HDU2819【二分匹配与矩阵的秩】