Treasure Exploration

复见此题,时隔久远,已忘,悲矣!

题意:用最少的机器人沿单向边走完(覆盖)全部的点。典型的最小路径覆盖,如果不懂二分图匹配可以参考:二分图大讲堂 先用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;
}

最新文章

  1. 【Android】YUV使用总结 —— Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别
  2. Linux如何查看与/dev/input目录下的event对应的设备
  3. CF 600B Queries about less or equal elements --- 二分查找
  4. 浅谈URLEncoder编码算法
  5. 0x和H都表示十六进制有什么区别吗?
  6. 关于#ifndef,#define,#end的说明
  7. 什么是防盗链设置中的空Referer
  8. Oracle笔试题库之问答题篇-总共60道
  9. 一步一步学EF系列2【最简单的一个实例】
  10. mysql shutdown and kill
  11. Golang:使用 httprouter 构建 API 服务器
  12. OOA、OOD、OOP分别是什么?
  13. React事件绑定几种方法测试
  14. Java笔记(十)堆与优先级队列
  15. java语法基础练习
  16. 转:void *
  17. Linux 权限使用 777 真的好吗?
  18. slf4j日志框架
  19. IntelliJ IDEA 快捷键(一)(window版)
  20. ZT UML 类与类之间的关系

热门文章

  1. hdu6118 度度熊的交易计划
  2. Vue-router 的练习
  3. uvm_subscriber——告诉她我们来过
  4. codevs 1277 生活大爆炸 2012年CCC加拿大高中生信息学奥赛
  5. App Transport Security has blocked a cleartext HTTP
  6. Codeforces Round #318 (Div. 2) C Bear and Poker (数学)
  7. POJ1077 八数码 BFS
  8. 数据库_8_SQL基本操作——数据操作
  9. spring-security中的csrf防御机制(跨域请求伪造)
  10. 第2节 azkaban调度:16、azkaban的介绍以及azkaban的soloserver的安装使用