zoukankan      html  css  js  c++  java
  • 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);
       }
    }
  • 相关阅读:
    rabbitmq使用
    redis
    IO模型与IO复用介绍
    事件驱动与异步IO使用
    协程
    进程
    线程、锁
    paramiko模块与 StringIO模块
    socketserver 编程
    随记
  • 原文地址:https://www.cnblogs.com/bxd123/p/10361765.html
Copyright © 2011-2022 走看看