POJ-2594 Treasure Exploration,floyd+最小路径覆盖!
2024-08-30 13:37:02
复见此题,时隔久远,已忘,悲矣!
题意:用最少的机器人沿单向边走完(覆盖)全部的点。典型的最小路径覆盖,如果不懂二分图匹配可以参考:二分图大讲堂 先用floyd传递闭包,再求最大匹配,最小路径覆盖=V-最大二分匹配(最小点覆盖)。为什么要用floyd传递闭包呢,每个点可以被多个机器人走过,博主就是这里没考虑到。。
我记得这个题是写过博客的。。。。//领接矩阵匈牙利算法。无重边无环。。。。。。
检查博客发现以前果然写过这个题的题解。。。
const int N=1e3+10;
int n,m,g[N][N],used[N],linked[N];
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=max(g[i][j],min(g[i][k],g[k][j]));
}
bool dfs(int u)
{
for(int i=1; i<=n; i++)
if(g[u][i]&&!used[i])
{
used[i]=1;
if(linked[i]==-1||dfs(linked[i]))
{
linked[i]=u;
return 1;
}
}
return 0;
}
int hungary()
{
int ans=0;
memset(linked,-1,sizeof(linked));
for(int i=1; i<=n; i++)
{
memset(used,0,sizeof(used));
if(dfs(i)) ans++;
}
return n-ans;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(m==n&&n==0) return 0;
memset(g,0,sizeof(g));
int u,v;
for(int i=0; i<m; i++)
{
scanf("%d%d",&u,&v);
g[u][v]=1;
}
floyd();
printf("%d\n",hungary());
}
return 0;
}
最新文章
- 【Android】YUV使用总结 —— Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别
- Linux如何查看与/dev/input目录下的event对应的设备
- CF 600B Queries about less or equal elements --- 二分查找
- 浅谈URLEncoder编码算法
- 0x和H都表示十六进制有什么区别吗?
- 关于#ifndef,#define,#end的说明
- 什么是防盗链设置中的空Referer
- Oracle笔试题库之问答题篇-总共60道
- 一步一步学EF系列2【最简单的一个实例】
- mysql shutdown and kill
- Golang:使用 httprouter 构建 API 服务器
- OOA、OOD、OOP分别是什么?
- React事件绑定几种方法测试
- Java笔记(十)堆与优先级队列
- java语法基础练习
- 转:void *
- Linux 权限使用 777 真的好吗?
- slf4j日志框架
- IntelliJ IDEA 快捷键(一)(window版)
- ZT UML 类与类之间的关系
热门文章
- hdu6118 度度熊的交易计划
- Vue-router 的练习
- uvm_subscriber——告诉她我们来过
- codevs 1277 生活大爆炸 2012年CCC加拿大高中生信息学奥赛
- App Transport Security has blocked a cleartext HTTP
- Codeforces Round #318 (Div. 2) C 	 Bear and Poker (数学)
- POJ1077 八数码 BFS
- 数据库_8_SQL基本操作——数据操作
- spring-security中的csrf防御机制(跨域请求伪造)
- 第2节 azkaban调度:16、azkaban的介绍以及azkaban的soloserver的安装使用