poj1422-最小路径覆盖(不交叉)&二分图-Air Raid
2017-11-28 15:24
465 查看
https://vjudge.net/problem/POJ-1422
给定一个图。点代表小城镇,边代表小城镇的路,你可以再一个点投一个伞兵,那个sb可以出发,经过任何他所经过的点,问你最少投多少伞兵。
要求①:伞兵不可以交叉。
思路① dfs?但是是有向图,不是求连通分量那种。
② topsort也是不行的,因为只能求topsort并不能确定有分叉的情况。
③ 正解,二分图求 最小路径覆盖。
给定一个图。点代表小城镇,边代表小城镇的路,你可以再一个点投一个伞兵,那个sb可以出发,经过任何他所经过的点,问你最少投多少伞兵。
要求①:伞兵不可以交叉。
思路① dfs?但是是有向图,不是求连通分量那种。
② topsort也是不行的,因为只能求topsort并不能确定有分叉的情况。
③ 正解,二分图求 最小路径覆盖。
#include <iostream> #include <cstdio> #include <vector> #include <cstring> using namespace std; /* */ const int maxn=200; int mp[maxn][maxn]; int linker[maxn]; bool used[maxn]; int m,n; bool dfs(int u){ for(int v=1;v<=m;v++){ if(mp[u][v]&&!used[v]){ used[v]=true; if(linker[v]==-1||dfs(linker[v])){ linker[v]=u; return true; } } } return false; } int t; int main() { int a,b; scanf("%d",&t); while(t--){ memset(mp,0,sizeof(mp)); scanf("%d%d",&m,&n); for(int i=0;i<n;i++){ scanf("%d%d",&a,&b); mp[a][b]=1; } /* for(int k=1;k<=m;k++){ for(int i=1;i<=m;i++){ for(int j=1;j<=m;j++) if(mp[i][k]&&mp[k][j]) mp[i][j]=1; } }*/ int res=0; memset(linker,-1,sizeof(linker)); for(int i=1;i<=m;i++){ memset(used,0,sizeof(used)); if(dfs(i)){ res++; } } // cout<<res<<endl; printf("%d\n",m-res);//最小路径覆盖就是顶点数-匹配数 } return 0; }
相关文章推荐
- POJ1422 Air Raid【二分图最小路径覆盖】
- POJ 1422 && ZOJ 1525 --Air Raid【二分图 && 最小路径覆盖】
- poj 1422&&HDU 1151 Air Raid(最小路径覆盖)
- hdu1151 二分图(无回路有向图)的最小路径覆盖 Air Raid
- hdu 1151 &&poj 1422 Air Raid (二分图匹配 最小路径覆盖)
- POJ 题目1422 Air Raid(二分图最小路径覆盖)
- HDU 1151 Air Raid(匈牙利算法 二分图的最小路径覆盖 )
- POJ 1422Air Raid(二分图最大匹配之最小路径覆盖)
- POJ-1422-Air Raid (二分图 最小路径覆盖)
- HDU1511 Air Raid(二分图,最小路径覆盖)
- HDOJ 1151 Air Raid(二分图最小路径覆盖)
- POJ-1422-Air Raid(二分图最小路径覆盖)
- HDOJ 题目1151 Air Raid(二分图,最小路径覆盖)
- 最小路径覆盖(二分图最大匹配):Air Raid
- POJ1422 Air Raid 【DAG最小路径覆盖】
- 【二分图|最小路径覆盖】POJ-1422 Air Raid
- POJ1422——Air Raid(二分图,最小路径覆盖)
- Air Raid POJ1422 & HDU1151 最小路径覆盖
- POJ 1422 && ZOJ 1525 Air Raid(有向图最小路径覆盖)
- hdu 1151 Air Raid(二分图最小路径覆盖)