POJ 2594 Treasure Exploration(最小路径覆盖-hungary+Floyd)
2015-09-03 08:45
543 查看
Description
在一个有向图上,至少放多少个机器人可以遍历整张图(每个顶点可以重复遍历)
Input
多组用例,每组用例第一行为两个整数N和M分别表示点数和边数,之后M行每行两个整数a和b表示a和b有边,以文件尾结束输入
Output
对于每组用例,输出至少放多少个机器人可以遍历整张图
Sample Input
1 0
2 1
1 2
2 0
0 0
Sample Output
1
1
2
Solution
因为每个点可以重复走,所以不能直接用最小路径覆盖,而是首先用Floyd算法求出这张图的传递闭包,然后对新图求最小路径覆盖即可
Code
在一个有向图上,至少放多少个机器人可以遍历整张图(每个顶点可以重复遍历)
Input
多组用例,每组用例第一行为两个整数N和M分别表示点数和边数,之后M行每行两个整数a和b表示a和b有边,以文件尾结束输入
Output
对于每组用例,输出至少放多少个机器人可以遍历整张图
Sample Input
1 0
2 1
1 2
2 0
0 0
Sample Output
1
1
2
Solution
因为每个点可以重复走,所以不能直接用最小路径覆盖,而是首先用Floyd算法求出这张图的传递闭包,然后对新图求最小路径覆盖即可
Code
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define maxn 555 int uN,vN; //u,v数目 int g[maxn][maxn];//编号是0~n-1的 int linker[maxn]; bool used[maxn]; bool dfs(int u) { int v; for(v=0;v<vN;v++) if(g[u][v]&&!used[v]) { used[v]=true; if(linker[v]==-1||dfs(linker[v])) { linker[v]=u; return true; } } return false; } int hungary() { int res=0; int u; memset(linker,-1,sizeof(linker)); for(u=0;u<uN;u++) { memset(used,0,sizeof(used)); if(dfs(u)) res++; } return res; } int main() { int N,M; while(scanf("%d%d",&N,&M),N||M) { uN=vN=N; memset(g,0,sizeof(g));//初始化 while(M--) { int u,v; scanf("%d%d",&u,&v); g[u-1][v-1]=1; } //Folyd求传递闭包 for(int k=0;k<N;k++) for(int i=0;i<N;i++) for(int j=0;j<N;j++) if(g[i][k]+g[k][j]==2) g[i][j]=1; printf("%d\n",N-hungary()); } return 0; }
相关文章推荐
- 开博整整10年纪念!
- Android开发:使用DDMS Heap进行内存泄露调试
- POJ 1422 && HDU 1151 Air Raid(最小路径覆盖-hungary)
- Linux 常用命令
- twoSum
- HDU 1068 Girls and Boys(最大点独立集-hungary)
- testFlight
- 实现一个不停发包的Android应用(类似于电脑上的Ping命令)
- WinDBG从Ring3到Ring0跟踪CreateFileW的执行流程
- vi & vim 移动 光标 滚动 屏幕
- 黑马程序员——Html
- zzuli OJ 1089: 阶乘的最高位
- cin.get()让程序可连续输入
- zzuli OJ 1088: 手机短号 (多实例)
- NoSQL
- HDU1258 Sum It Up(DFS)
- 悟透JavaScript
- 野人学Android基础篇之四大组件第一课--Activity的生命周期
- 已解——navicat premium连接mySQL,无法连接
- zzuli OJ 1087: 获取出生日期(多实例测试)