hdu2819二分图匹配

来源:互联网 发布:mac qq离线发送 编辑:程序博客网 时间:2024/06/09 22:13
E - Swap
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status Practice HDU 2819

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

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
原创粉丝点击