码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1507 Uncle Tom's Inherited Land*

时间:2015-04-06 21:27:48      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

这两天刚学二分图,对二分图的应用还不熟练;感觉自己还是太弱了,这题是参考别人代码的;

这题是把(i+j)的值得奇偶性来分图的,请原谅我没有想到,还是太水了..根本没有思路..

先用一个数组暂时存起鱼塘位置,再通过判断,重新建图,对这个新图进行二分匹配;

技术分享
 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 #define maxn 510
 5 int uN,vN;//u,v数目
 6 int map[maxn][maxn];
 7 int linker[maxn];
 8 bool visit[maxn];
 9 bool dfs(int u)//从左边开始找增广路径
10 {
11     int v;
12     for(v=0;v<vN;v++)
13         if(map[u][v]&&!visit[v])
14         {
15             visit[v]=true;
16             if(linker[v]==-1||dfs(linker[v]))
17             {//找增广路,反向
18                 linker[v]=u;
19                 return true;
20             }
21         }
22         return false;//这个不要忘了,经常忘记这句
23 }
24 int hungary()
25 {
26     int res=0;
27     int u;
28     memset(linker,-1,sizeof(linker));
29     for(u=0;u<uN;u++)
30     {
31         memset(visit,0,sizeof(visit));
32         if(dfs(u)) res++;
33     }
34     return res;
35 }
36 int a[110][110];
37 int b[100];
38 int main()
39 {
40     //freopen("1507.txt","r",stdin);
41     int n,m,k;
42     int u,v;
43     while(~scanf("%d%d",&n,&m)&&(n||m))
44     {
45         scanf("%d",&k);
46         memset(a,0,sizeof(a));
47         while(k--)
48         {
49             scanf("%d%d",&u,&v);
50             u--;v--;
51             a[u][v] = -1;
52         }
53         int index = 0;
54         for(int i = 0;i < n;i++)
55             for(int j = 0;j < m;j++)
56                 if(a[i][j]!=-1)
57                 {
58                     b[index] = i*n + j;//这个用来存坐标;
59                     a[i][j] = index++;
60                 }
61                 uN = vN = index;
62                 memset(map,0,sizeof(map));
63                 for(int i = 0;i < n;i++)
64                     for(int j= 0;j < m;j++)
65                         if(a[i][j]!=-1 && (i+j)%2==1)
66                         {
67                             u = a[i][j];
68                             if(i > 0 && a[i-1][j]!=-1)
69                                 map[u][a[i-1][j]]=1;
70                             if(i < n-1 && a[i+1][j]!=-1)                                
71                                 map[u][a[i+1][j]]=1;
72                             if(j > 0 && a[i][j-1]!=-1)
73                                 map[u][a[i][j-1]]=1;
74                             if(j < m-1 && a[i][j+1]!=-1)
75                                 map[u][a[i][j+1]]=1;
76                         }
77                         int ans = hungary();
78                         printf("%d\n",ans);
79                         for(int i = 0;i <vN;i++)
80                             if(linker[i]!=-1)
81                             {
82                                 int x1 = b[i]/n;
83                                 int y1 = b[i]%n;
84                                 int x2 = b[linker[i]]/n;
85                                 int y2 = b[linker[i]]%n;
86                                 printf("(%d,%d)--(%d,%d)\n",x1+1,y1+1,x2+1,y2+1);
87                             }
88                             printf("\n");
89     }
90     return 0;
91 }
View Code

 

hdu 1507 Uncle Tom's Inherited Land*

标签:

原文地址:http://www.cnblogs.com/xiaoniuniu/p/4396512.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!