hdu2819二分图匹配
来源:互联网 发布:mac qq离线发送 编辑:程序博客网 时间:2024/06/09 22:13
E - Swap
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription
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”.
If it is impossible to make all the diagonal entries equal to 1, output only one one containing “-1”.
Sample Input
20 11 021 01 0
Sample Output
1R 1 2-1
#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>using namespace std;const int maxn=105;int g[maxn][maxn];int linker[maxn];bool used[maxn];int n;bool dfs(int u){ for(int i=1; i<=n; i++) { if(!used[i]&&g[u][i]) { used[i]=true; if(!linker[i]||dfs(linker[i])) { linker[i]=u; return true; } } } return false;}int solve(){ int ans=0; memset(linker,0,sizeof(linker)); for(int i=1; i<=n; i++) { memset(used,false,sizeof(used)); if(dfs(i)) ans++; } return ans;}int main(){ int a[maxn],b[maxn]; int op; while(scanf("%d",&n)!=-1) { memset(g,0,sizeof(g)); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { scanf("%d",&op); if(op) g[i][j]=1; } int temp=solve(); if(temp!=n) { cout<<-1<<endl; continue; } int tot = 0,j; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) if(i != j&&linker[j]==i)//交换第i列和第j列 { a[tot] = i; b[tot] = j; tot ++;//记录结果 int t = linker[i]; linker[i] = linker[j]; linker[j] = t; } } cout<<tot<<endl; for(int i=0; i<tot; i++) { printf("C %d %d\n",a[i],b[i]); } } return 0;}
0 0
- hdu2819二分图匹配
- HDU2819 Swap (二分图匹配)
- hdu2819 swap(二分图匹配)
- 【图论】【二分图匹配】[HDU2819]Swap
- hdu2819棋盘游戏(二分图匹配)
- hdu2819-Swap(二分图匹配,思路)
- hdu2819 Swap(二分匹配)
- hdu2819 Swap 二分图最大匹配 输出路径
- HDU2819 Swap(二分图匹配匈牙利算法+记录路径)
- HDU2819【二分匹配与矩阵的秩】
- hdu2819(二分构图)
- HDU2819 Swap 最大匹配
- HDU2819 Swap 看似很难的题目其实用二分匹配就解决了
- hdu2819 Swap--最大匹配数
- hdu2819
- Swap(hdu2819,最大匹配+记录路径)
- 二分图图匹配
- 二分图匹配
- poj1008——日期转化题
- 每日三只DP
- 关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案
- 如何通过DDR芯片的丝印字符判断其容量
- Linux下逻辑地址-线性地址-物理地址图解
- hdu2819二分图匹配
- 六个月学会任何一门外语
- CodeForces 609 C. Load Balancing(水~)
- linux命令之ls
- 沙盒与数据库
- ThinkPHP去除url中的index.php以及绑定模块
- 构建黄金组合LVS + Keepalived高可用负载均衡集群
- 【Usaco2015 JAN】Moovie Mooving 题解
- JSP/Servlet认识