题意:

背景:

小镇有n个路口,空降兵可以在任意路口降落。有m条通往别的路口的单向边,但是不会出现循环。

问最少空降多少个士兵可以走完所有路口。

数据输入:

测试组数 t

每组有:

路口数 n

边数 m

接下来m组,每组a b代表a到b的单向边。

思路:

这是一个朴素的最小路覆盖数问题。

定理:最小路覆盖数=节点数-最大匹配数。

二分匹配的匈牙利算法不重复。

【菜鸟第一次写最大匹配,代码的错误在于当找到来源是本身的时候继续递归了】

/*************************************************************************
> File Name: F.cpp
> Author: ttpond
> Created Time: 2015-8-17 9:55:53
************************************************************************/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<vector>
#include<map>
#include<queue>
#include<stack>
using namespace std;
vector<int>tmp[];
bool vis[];
int from[];
int ans=;
void dfs(int n)
{
vector<int>::iterator it;
for(it=tmp[n].begin();it!=tmp[n].end();it++)
{
if(!vis[*it])
{
from[*it]=n;
vis[*it]=;
ans++;
break;
}
else
{
if(from[*it]!=n)
dfs(from[*it]);
}
}
}
int main()
{
int t,tt,v,e;
scanf("%d",&t);
for(tt=;tt<t;tt++)
{
ans=;
memset(vis,,sizeof(vis));
scanf("%d%d",&v,&e);
for(int i=;i<=v;i++)
tmp[i].clear();
for(int i=;i<e;i++)
{
int a,b;
scanf("%d%d",&a,&b);
tmp[a].push_back(b);
}
for(int i=;i<=v;i++)
dfs(i);
printf("%d\n",v-ans);
}
return ;
}

最新文章

  1. Ubuntu/linux 有关权限修改的命令
  2. Uniscribe文字自动换行
  3. NDK编译生成so文件
  4. dstat
  5. URL重写案例
  6. 模拟等待事件row lock waits
  7. netbean7.4 保存远程项目的时候老是跳警告框的解决方案
  8. 字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian
  9. opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar &amp; 图像对比度、亮度值调整
  10. 手写Maven的archetype项目脚手架
  11. python邮件SMTP的GUI编程
  12. .Net中stirng转Systen.Type的一种实现思路
  13. 敏捷方法之极限编程(XP)和 Scrum
  14. AJAX-DOM事件
  15. Python上下文管理协议:__enter__和__exit__
  16. Android - 自定义控件和属性(attr和TypedArray)
  17. ES6标准入门之正则表达式的拓展
  18. arduino驱动安装
  19. 51 nod 1200 石子游戏V2 FWT
  20. 《剑指offer》— JavaScript(25)复杂链表的复制

热门文章

  1. AngularJS日期格式化
  2. 在Windows 10 系统上启用Hyper V遇到的错误:0x800f0831
  3. JDO
  4. About App Sandbox
  5. QT+ 状态栏+核心控件+浮动窗口
  6. JetBrains系列产品激活
  7. image的resizeMode属性
  8. 牛客OI赛制测试赛2(0906)
  9. 22. SCHEMA_PRIVILEGES
  10. vue-loader 细节