博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2594 Treasure Exploration (Floyd+最小路径覆盖)
阅读量:4706 次
发布时间:2019-06-10

本文共 1369 字,大约阅读时间需要 4 分钟。

<>

题目大意:

机器人探索宝藏,有N个点,M条边。问你要几个机器人才能遍历所有的点。 

解题分析:

刚开始还以为是最小路径覆盖的模板题,但是后面才知道,本题允许一个点经过多次,这与最小路径覆盖中,路径之间不能有交点重合相矛盾,所以,我们用Floyd利用传递闭包对原图进行一些处理。所谓传递闭包就是,a能到b,b能到c,所以a能到c。最后对处理后的图计算最小路径覆盖。

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 const int N =505; 7 int n,m; 8 int g[N][N],vis[N],match[N]; 9 bool dfs(int x){10 for(int i=1;i<=n;i++){11 if(g[x][i]&&!vis[i]){12 vis[i]=1;13 if(match[i]==-1||dfs(match[i])){14 match[i]=x;15 return true;16 }17 }18 }19 return false;20 }21 int Hungary(){22 int ans=0;23 memset(match,-1,sizeof(match));24 for(int i=1;i<=n;i++){25 memset(vis,0,sizeof(vis));26 ans+=dfs(i);27 }28 return ans;29 }30 void Floyd(){ //Floyd传递闭包31 for(int k=1;k<=n;k++)32 for(int i=1;i<=n;i++)33 for(int j=1;j<=n;j++)34 if(g[i][k]&&g[k][j])35 g[i][j]=1;36 }37 int main(){38 while(scanf("%d%d",&n,&m)!=EOF,n||m){39 memset(g,0,sizeof(g));40 for(int i=1;i<=m;i++){41 int u,v;scanf("%d%d",&u,&v);42 g[u][v]=1; 43 }44 Floyd();45 printf("%d\n",n-Hungary());46 }47 }

 

 

2018-11-15

转载于:https://www.cnblogs.com/00isok/p/9966747.html

你可能感兴趣的文章
查看手机已经记住的WIFI密码
查看>>
最新版IntelliJ IDEA2019 破解教程(2019.08.07-情人节更新)
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
adb shell am 的用法
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>
FindChildControl与FindComponent
查看>>
中国城市json
查看>>
android下载手动下载Android SDK
查看>>
C++学习:任意合法状态下汉诺塔的移动(原创)
查看>>
leetcode133 - Clone Graph - medium
查看>>
UNET学习笔记2 - 高级API(HLAPI)
查看>>
"ORA-00942: 表或视图不存在 "的原因和解决方法[转]
查看>>
Oauth支持的5类 grant_type 及说明
查看>>
C#中用DateTime的ParseExact方法解析日期时间(excel中使用系统默认的日期格式)
查看>>
W3100SM-S 短信猫代码发送 上
查看>>
netty接收大文件的方法
查看>>
软件工程设计之四则运算
查看>>
SpringMVC @ResponseBody 406
查看>>
Partial Tree UVALive - 7190(完全背包)
查看>>