zoukankan      html  css  js  c++  java
  • [POJ] 1422 Air Raid(最小路径覆盖)

    题目地址:http://poj.org/problem?id=1422

    一个地图上有n个小镇,以及连接着其中两个小镇的有向边,而且这些边无法形成回路。现在选择一些小镇空降士兵(1个小镇最多1个士兵),士兵能沿着边走到尽头,问最少空降几个士兵,能遍历完所有的小镇。最小路径覆盖问题。先拆点,将每个点分为两个点,左边是1到n个点,右边是1到n个点
    然后每一条有向边对应左边的点指向右边的点

    因为最小路径覆盖 = 节点数 - 最大匹配数,所以匈牙利算法求一下二分图最大匹配就能得出结果了。
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<string.h>
     4 #include<algorithm>
     5 #include<math.h>
     6 #include<stdbool.h>
     7 #include<time.h>
     8 #include<stdlib.h>
     9 #include<set>
    10 #include<map>
    11 #include<stack>
    12 #include<queue>
    13 #include<vector>
    14 using namespace std;
    15 #define clr(x,y)    memset(x,y,sizeof(x))
    16 #define sqr(x)      ((x)*(x))
    17 #define rep(i,a,b)  for(int i=(a);i<=(b);i++)
    18 #define LL          long long
    19 #define INF         0x3f3f3f3f
    20 #define A           first
    21 #define B           second
    22 #define PI          3.14159265358979323
    23 const int N=200+11;
    24 int n,m,f[N],g[N][N],link[N];
    25 
    26 void init()
    27 {
    28     clr(f,0);
    29     clr(g,0);
    30     clr(link,-1);
    31 }
    32 
    33 bool find(int x)
    34 {
    35     for(int i=1;i<=n;i++) {
    36         if(!f[i] && g[x][i]) {
    37             f[i]=1;
    38             if(link[i]==-1 || find(link[i])) {
    39                 link[i]=x;
    40                 return true;
    41             }
    42         }
    43     }
    44     
    45     return false;
    46 }
    47 
    48 int hungary()
    49 {
    50     int ans=0;
    51     for(int i=1;i<=n;i++) {
    52         clr(f,0);
    53         if(find(i)) ans++;
    54     }
    55     return ans;
    56 }
    57 
    58 int main()
    59 {
    60     int u,v,cas,k;
    61     
    62     scanf("%d",&cas);
    63     while(cas--) {
    64         init();
    65         scanf("%d%d",&n,&m);
    66         while(m--) {
    67             scanf("%d%d",&u,&v);
    68             g[u][v]=1;
    69         }
    70         printf("%d
    ",n-hungary());
    71     }
    72     return 0;
    73 }
     
  • 相关阅读:
    DOS命令大全 1 attrib,delete等 外部 内部 命令都有
    css图像映射
    简单的css样式控制分页效果
    (转)AjaxPro实现机制探讨——Ajax是如何调用服务器端C#方法?
    学习笔记ADO.Net方面
    一个挺好用的数据库操作类
    .net开发人员应该知道(二)
    js与C#之间相互调用的一些方法
    JS 事件大全
    .net开发人员应该知道(一)
  • 原文地址:https://www.cnblogs.com/sxiszero/p/4375897.html
Copyright © 2011-2022 走看看