zoukankan      html  css  js  c++  java
  • hdu 1507 Uncle Tom's Inherited Land*

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

    这题是把(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
    ",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)
    ",x1+1,y1+1,x2+1,y2+1);
    87                             }
    88                             printf("
    ");
    89     }
    90     return 0;
    91 }
    View Code
  • 相关阅读:
    javascript 时间与时间戳的转换
    javascript 判断对象的内置类型
    javascript 动态脚本添加
    javascript select标签的操作
    javascript canvas画订单
    css 移动端图片等比显示处理
    FastDFS分布式文件系统
    欧拉回路--模板
    tarjan求双联通分量--POJ 1523 +P2860 [USACO06JAN]Redundant Paths G
    tarjan求割点和割边
  • 原文地址:https://www.cnblogs.com/xiaoniuniu/p/4396512.html
Copyright © 2011-2022 走看看