Air Raid HDU 1151

题意  给定n个路口 加上一些单向路  求遍历完所有路口需要多少人  人是空降的 哪里都可以作为起点

求 最小边覆盖   (用最少的边覆盖所有的点) 也叫最小路径覆盖(更形象) 也叫二分图的最大独立集合

最小边覆盖==所有点-最大匹配数(匈牙利算法)

理解: 如果没有路  则要n个人  多一条路  则可以减一个人  .

#include<bits/stdc++.h>
using namespace std;

#define MAXI 505

int mp[MAXI][MAXI];
int used[MAXI];
int vis[MAXI];//记录的是匹配情况
int n,m;//n为左图  m为右图
bool dfs(int  x)
{
    for(int j=1;j<=n;j++)
    {
        if(mp[x][j]&&!used[j])
        {
            used[j]=1;
            if(!vis[j]||dfs(vis[j]))
              {
                  vis[j]=x;
                  return true;
              }
        }
    }
    return false;
}


int main()
{
   int cas;
   scanf("%d",&cas);
   while(cas--)
   {
       memset(mp,0,sizeof(mp));
       memset(vis,0,sizeof(vis));
       scanf("%d%d",&n,&m);
       while(m--)
       {
           int a,b;
           scanf("%d%d",&a,&b);
           mp[a][b]=1;
       }
       int ans=0;
       for(int i=1;i<=n;i++)
       {
           memset(used,0,sizeof(used));
           if(dfs(i))ans++;
       }
       printf("%d
",n-ans);
   }
}
原文地址:https://www.cnblogs.com/bxd123/p/10361765.html