kuangbin专题十 HDU1151 Air Raid (最小路径覆盖)
2018-01-12 13:44
525 查看
题意:
一个城镇中有n个十字路口和m条单向的路,图是无环图,现在要派一些伞兵去这些空袭,要到达所有的路口,每个在一个十字路口着陆了的伞兵可以沿着街去到其他路口,
我们的任务就是求出去执行任务的伞兵最少可以派几个。
题解:
其实就是求最小路径覆盖。
最小路径覆盖=顶点数-最大匹配数
一个城镇中有n个十字路口和m条单向的路,图是无环图,现在要派一些伞兵去这些空袭,要到达所有的路口,每个在一个十字路口着陆了的伞兵可以沿着街去到其他路口,
我们的任务就是求出去执行任务的伞兵最少可以派几个。
题解:
其实就是求最小路径覆盖。
最小路径覆盖=顶点数-最大匹配数
#include<stdio.h> #include<string.h> #include<vector> #include<algorithm> using namespace std; const int MAXN=120+7; vector<int>map[MAXN]; bool vis[MAXN]; int cx[MAXN],cy[MAXN]; int n,m; int dfs(int u) { for(int i=0;i<map[u].size();i++) { int v=map[u][i]; if(!vis[v]) { vis[v]=true; if(cy[v]==-1||dfs(cy[v])) { cx[u]=v; cy[v]=u; return 1; } } } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) map[i].clear(); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); map[u].push_back(v); } memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy)); int res=0; for(int i=1;i<=n;i++) { memset(vis,false,sizeof(vis)); res+=dfs(i); } printf("%d\n",n-res); } return 0; }
相关文章推荐
- hdu1151 Air Raid --- 最小路径覆盖
- hdu1151Air Raid——最小路径覆盖
- hdu1151 二分图(无回路有向图)的最小路径覆盖 Air Raid
- hdu1151 Air Raid,DAG图的最小路径覆盖
- 【hdu1151】—Air Raid(最小路径覆盖)
- hdu1151 Air Raid 最小路径覆盖
- Hdu1151 Air Raid(最小覆盖路径)
- Air Raid POJ1422 & HDU1151 最小路径覆盖
- Air Raid---hdu1151(最小路径覆盖)
- hdu1151 air Raid(最小路径覆盖)
- hdu1151 Air Raid (最小路径覆盖)
- hdu1151 Air Raid,DAG图的最小路径覆盖
- HDU1151 Air Raid(有向图最小路径覆盖)
- HDU1151_Air Raid(二分图/最小路径覆盖=n-最大匹配)
- POJ1422 Air Raid 【DAG最小路径覆盖】
- poj 1422&&HDU 1151 Air Raid(最小路径覆盖)
- POJ 1422 Air Raid 最小路径覆盖(二分图匹配)
- HDU - 1151 Air Raid (最小路径覆盖)
- HDU 1151 Air Raid(最小路径覆盖)
- POJ 1422 Air Raid(DAG最小路径覆盖)