• Antenna Placement(二分图的最大匹配)


    http://poj.org/problem?id=3020

    题意:

    一个矩形中,有N个城市'*',现在这n个城市都要覆盖无线,若放置一个基站,它至多可以覆盖相邻的两个城市。
    问至少放置多少个基站才能使得所有的城市都覆盖无线?

    无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2

     1 #include <stdio.h>
     2 #include <string.h>
     3 const int N=505;
     4 int pos[N][N],map[N][N];
     5 int link[N];
     6 bool vis[N];
     7 int dir[4][2] = {{0,-1},{0,1},{1,0},{-1,0}};
     8 int n;
     9 int dfs(int x)
    10 {
    11     for (int i = 1; i <= n; i++)
    12     {
    13         if (map[x][i]&&!vis[i])
    14         {
    15             vis[i] = true;
    16             if(!link[i]||dfs(link[i]))
    17             {
    18                 link[i] = x;
    19                 return 1;
    20             }
    21         }
    22     }
    23     return 0;
    24 }
    25 int main()
    26 {
    27     char ch;
    28     int t,h,w;
    29     scanf("%d",&t);
    30     while(t--)
    31     {
    32         int id = 0;
    33         int ans = 0;
    34         scanf("%d%d%*c",&h,&w);
    35         memset(pos,0,sizeof(pos));
    36         memset(map,0,sizeof(map));
    37         memset(link,0,sizeof(link));
    38         for(int i = 1; i <= h; i++)
    39         {
    40             for (int j = 1; j <= w; j++)
    41             {
    42                 scanf("%c",&ch);
    43                 if (ch=='*')
    44                     pos[i][j] = ++id;
    45             }
    46             getchar();
    47         }
    48         for (int i = 1; i <= h; i++)
    49         {
    50             for (int j = 1; j <= w; j++)
    51             {
    52                 if(pos[i][j])
    53                     for (int k = 0; k < 4; k++)
    54                     {
    55                         int dx = i+dir[k][0];
    56                         int dy = j+dir[k][1];
    57                         if(pos[dx][dy])
    58                         {
    59                             map[pos[i][j]][pos[dx][dy]] = 1;
    60                         }
    61                     }
    62             }
    63         }
    64         n = id;
    65         for (int i = 1; i <= n; i++)
    66         {
    67             memset(vis,0,sizeof(vis));
    68             if(dfs(i))
    69                 ans++;
    70         }
    71         printf("%d
    ",n-ans/2);//无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    Struts2 (二)入门
    Struts2 (一)入门
    Hibernate 配置和注解式 ,关联关系
    Hibernate入门,HQL,双向表关联关系
    web自定义标签
    Spring整合MyBatis 基础
    PHP字符串——字符串函数
    php功能模块学习笔记
    PHP常用符号和函数
    asp xmlhttp 读取文件
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3544930.html
Copyright © 2020-2023  润新知