zoukankan      html  css  js  c++  java
  • hdu

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

    在一个城市里有n个地点和k条道路,道路都是单向的,并且不存在环.(DAG)

    现在伞兵需要去n个地点视察,伞兵只能沿着路的方向走,问最少需要多少伞兵。

    DAG的最小路径覆盖是指找最小数目的互相不相交的有向路径,满足DAG的所有顶点都被覆盖.

    首先给出公式:DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数.

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <vector>
     4 using namespace std;
     5 const int maxn = 150;
     6 int n,k;
     7 vector<int>G[10010];
     8 int link[maxn];
     9 bool vis[maxn];
    10 
    11 void add_edge(int u,int v)
    12 {
    13     G[u].push_back(v);
    14 }
    15 
    16 bool dfs(int u)
    17 {
    18     for(int i=0;i<G[u].size();i++)
    19     {
    20         int v=G[u][i];
    21         if(!vis[v])
    22         {
    23             vis[v]=true;
    24             if(link[v]==-1||dfs(link[v]))
    25             {
    26                 link[v]=u;
    27                 return true;
    28             }
    29         }
    30     }
    31     return false;
    32 }
    33 int main()
    34 {
    35    //freopen("a.txt","r",stdin);
    36     int t,b,c;
    37     scanf("%d",&t);
    38     while(t--)
    39     {
    40         scanf("%d%d",&n,&k);
    41         for(int i=0;i<n;i++) G[i].clear();
    42         for(int i=0;i<k;i++)
    43         {
    44             scanf("%d%d",&b,&c);
    45             add_edge(b-1,c-1);
    46         }
    47         int ans=0;
    48         memset(link,-1,sizeof(link));
    49         for(int i=0;i<n;i++)
    50         {
    51             memset(vis,0,sizeof(vis));
    52             if(dfs(i)) ans++;
    53         }
    54         printf("%d
    ",n-ans);
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    概率论中几个入门公式
    记一道贝叶斯公式的裸题
    BZOJ3585: mex(主席树)
    利用MingW检验程序运行内存
    清北集训Day3T1(转换)
    万能pb_ds头文件—bits/extc++.h
    清北集训Day1T3 LYK loves jumping(期望DP)
    洛谷P1962 斐波那契数列(矩阵快速幂)
    namespace用法
    BZOJ4868: [Shoi2017]期末考试
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4590890.html
Copyright © 2011-2022 走看看