hdu 4185(最大匹配)

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

思路:坐标映射建双向图,只要满足条件构成矩阵,就连边,最后求一下最大匹配即可。

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<vector>

 6 using namespace std;

 7 #define MAXN 360036

 8 vector<int>vet[MAXN];

 9 char map[666][666];

10 bool mark[MAXN];

11 int n;

12 int ly[MAXN];

13 

14 int dfs(int u){

15    for(int i=0;i<vet[u].size();i++){

16       int v=vet[u][i];

17       if(!mark[v]){

18          mark[v]=true;

19          if(ly[v]==-1||dfs(ly[v])){

20             ly[v]=u;

21             return 1;

22          }

23       }

24    }

25    return 0;

26 }

27 

28 int MaxMatch(){

29    int res=0;

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

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

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

33       res+=dfs(i);

34    }

35    return res;

36 }

37 

38 int main(){

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

40    int _case,t=1;

41    scanf("%d",&_case);

42    while(_case--){

43       scanf("%d",&n);

44       for(int i=1;i<=n*n;i++)vet[i].clear();

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

46          scanf("%s",map[i]+1);

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

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

49             if(map[i][j]=='.')continue;

50             if(i+1<=n&&map[i+1][j]=='#'){

51                vet[(i-1)*n+j].push_back(i*n+j);

52                vet[i*n+j].push_back((i-1)*n+j);

53             }

54             if(j+1<=n&&map[i][j+1]=='#'){

55                vet[(i-1)*n+j].push_back((i-1)*n+j+1);

56                vet[(i-1)*n+j+1].push_back((i-1)*n+j);\

57             }

58          }

59       }

60       int ans=MaxMatch();

61       printf("Case %d: %d\n",t++,ans/2);

62    }

63    return 0;

64 }
View Code

 

你可能感兴趣的:(HDU)