zoukankan      html  css  js  c++  java
  • hdu1045 Fire Net

    http://acm.hdu.edu.cn/showproblem.php?pid=1045

    二分图匹配,匈牙利算法(dfs+邻接矩阵),König定理

    需要自己建新图

    以前用搜索做过~ 感觉建图好神奇

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define N 10
     4 
     5 int n, m;
     6 int map0[N][N], map1[N][N], map2[N][N];
     7 int map[N][N], girl[N], flag[N];
     8 
     9 int find(int x)
    10 {
    11     int i;
    12     for(i=1; i<=m; i++)
    13     {
    14         if(!flag[i] && map[x][i])
    15         {
    16             flag[i] = 1;
    17             if(girl[i]==-1 || find(girl[i]))
    18             {
    19                 girl[i] = x;
    20                 return 1;
    21             }
    22         }
    23     }
    24     return 0;
    25 }
    26 
    27 int main()
    28 {
    29     int n0, i, j, sum, count;
    30     char c;
    31     while(scanf("%d%*c", &n0), n0)
    32     {
    33         //初始化
    34         memset(map, 0, sizeof(map));
    35         memset(girl, -1, sizeof(girl));
    36         for(i=1; i<=n0; i++)
    37         {
    38             map0[i][0] = map0[0][i] = 1;
    39             for(j=1; j<=n0; j++)
    40             {
    41                 scanf("%c", &c);
    42                 map0[i][j] = c-'.';
    43             }
    44             getchar();
    45         }
    46         //给每个点编一个新行号
    47         count = 0;
    48         for(i=1; i<=n0; i++)
    49         {
    50             for(j=1; j<=n0; j++)
    51             {
    52                 if(map0[i][j-1] && (!map0[i][j]))
    53                 {
    54                     count ++;
    55                 }
    56                 map1[i][j] = count;
    57             }
    58         }
    59         n = count;
    60         //给每个点编一个新列号
    61         count = 0;
    62         for(j=1; j<=n0; j++)
    63         {
    64             for(i=1; i<=n0; i++)
    65             {
    66                 if(map0[i-1][j] && (!map0[i][j]))
    67                 {
    68                     count ++;
    69                 }
    70                 map2[i][j] = count;
    71             }
    72         }
    73         m = count;
    74         //根据新的行列号,建图
    75         for(i=1; i<=n0; i++)
    76         {
    77             for(j=1; j<=n0; j++)
    78             {
    79                 if(!map0[i][j])
    80                 {
    81                     map[map1[i][j]] [map2[i][j]] = 1;
    82                 }
    83             }
    84         }
    85         //匈牙利算法
    86         sum = 0;
    87         for(i=1; i<=n; i++)
    88         {
    89             memset(flag, 0, sizeof(flag));
    90             sum += find(i);
    91         }
    92         printf("%d\n", sum);        
    93     }
    94     return 0;
    95 }
  • 相关阅读:
    HDFS工作流程
    HADOOP 安全模式
    Hadoop环境的搭建
    面向对象-绑定与非绑定方法
    面向对象-封装
    面向对象-继承与派生
    面向对象-多态与多态性
    面向对象-绑定方法
    LOL游戏基本代码
    1 面向对象的程序设计
  • 原文地址:https://www.cnblogs.com/yuan1991/p/hdu1045.html
Copyright © 2011-2022 走看看