标签:
这两天刚学二分图,对二分图的应用还不熟练;感觉自己还是太弱了,这题是参考别人代码的;
这题是把(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 }
hdu 1507 Uncle Tom's Inherited Land*
标签:
原文地址:http://www.cnblogs.com/xiaoniuniu/p/4396512.html