hdu 2819(二分匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819

思路:有矛盾关系的可以考虑二分匹配= =只交换行或者只交换列都能得到目的,如果不能,就输出-1。建图的时候应该建有向图。

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<cmath>[

 6 using namespace std;

 7 #define MAXN 111

 8 int n,x;

 9 int map[MAXN][MAXN];

10 bool mark[MAXN];

11 int row[MAXN];

12 int ly[MAXN];

13 

14 bool dfs(int u){

15    for(int i=1;i<=n;i++){

16       if(map[u][i]&&!mark[i]){

17          mark[i]=true;

18          if(ly[i]==-1||dfs(ly[i])){

19             ly[i]=u;

20             return true;

21          }

22       }

23    }

24    return false;

25 }

26 

27 

28 bool MaxMatch(){

29    memset(ly,-1,sizeof(ly));

30    for(int i=1;i<=n;i++){

31       memset(mark,false,sizeof(mark));

32       if(!dfs(i))return false;

33    }

34    return true;

35 }

36 

37 

38 int main(){

39 //   freopen("1.txt","r",stdin);

40    while(~scanf("%d",&n)){

41       memset(map,0,sizeof(map));

42       for(int i=1;i<=n;i++){

43          for(int j=1;j<=n;j++){

44             scanf("%d",&x);

45             map[j][i]=x;

46          }

47       }

48       if(!MaxMatch()){ puts("-1");continue; }

49       for(int i=1;i<=n;i++){

50          for(int j=i;j<=n;j++){

51             if(ly[j]==i){ row[i]=j;swap(ly[j],ly[i]);break; }

52          }

53       }

54       printf("%d\n",n);

55       for(int i=1;i<=n;i++)

56          printf("R %d %d\n",i,row[i]);

57    }

58    return 0;

59 }
View Code

 

你可能感兴趣的:(HDU)