Treasure Exploration
Time Limit: 6000MS   Memory Limit: 65536K
Total Submissions: 8130   Accepted: 3325

Description

Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored treasure? If you never have such experiences, you would never know what fun treasure exploring brings to you. 

Recently, a company named EUC (Exploring the Unknown Company) plan to explore an unknown place on Mars, which is considered full of treasure. For fast development of technology and bad environment for human beings, EUC sends some robots to explore the treasure. 

To make it easy, we use a graph, which is formed by N points (these N points are numbered from 1 to N), to represent the places to be explored. And some points are connected by one-way road, which means that, through the road, a robot can only move from one
end to the other end, but cannot move back. For some unknown reasons, there is no circle in this graph. The robots can be sent to any point from Earth by rockets. After landing, the robot can visit some points through the roads, and it can choose some points,
which are on its roads, to explore. You should notice that the roads of two different robots may contain some same point. 

For financial reason, EUC wants to use minimal number of robots to explore all the points on Mars. 

As an ICPCer, who has excellent programming skill, can your help EUC?

Input

The input will consist of several test cases. For each test case, two integers N (1 <= N <= 500) and M (0 <= M <= 5000) are given in the first line, indicating the number of points and the number of one-way roads in the graph respectively. Each of the following
M lines contains two different integers A and B, indicating there is a one-way from A to B (0 < A, B <= N). The input is terminated by a single line with two zeros.

Output

For each test of the input, print a line containing the least robots needed.

Sample Input

1 0
2 1
1 2
2 0
0 0

Sample Output

1
1
2

题意:寻宝,有N个点,m条路,接下来m行每行两个数a,b表示a到b之间连有一条单向路,所以此题图为有向图。每个机器人可以从任意点作为起点然后到达终点,但无法返回,所以求最少需要多少机器人走完这n个点。

思路:很明显最小路径覆盖问题,最小路径覆盖=顶点数-最大点覆盖;但这题的路有点特殊,为了节约成本,当然是只要有路能走下去就一直走下去,题目表明可以重复经过某个点。所以非直接相连的点我们用floyd将其连接,在求连接后的图的最小路径覆盖。这便是此题的思路;

const int N=500+10;
int n,m,w[N][N],linked[N],v[N];
void floyd()//传递闭包
{
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(!w[i][j]&&w[i][k]&&w[k][j])
w[i][j]=1;
// for(int k=1; k<=n; k++)
// for(int i=1; i<=n; i++)
// printf("%d %d %d\n",k,i,w[k][i]);
}
int dfs(int u)
{
for(int i=1;i<=n;i++)
if(w[u][i]&&!v[i])
{
v[i]=1;
if(linked[i]==-1||dfs(linked[i]))
{
linked[i]=u;
return 1;
}
}
return 0;
}
void hungary()
{
int ans=0;
memset(linked,-1,sizeof(linked));
for(int i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
if(dfs(i)) ans++;
}
printf("%d\n",n-ans);//最小路径覆盖;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0) break;
int u,v;
memset(w,0,sizeof(w));
while(m--)
{
scanf("%d%d",&u,&v);
w[u][v]=1;
}
floyd();
hungary();
}
return 0;
}

妙哉!

最新文章

  1. codeforces 342E :Xenia and Tree
  2. ASP.NET MVC5 网站开发实践(一) - 项目框架(转)
  3. Android 仿土巴兔选择效果
  4. CentOS 6.4 安装搭建 Scrapy 0.22 环境
  5. The Promise of Deep Learning
  6. eclipse下切换svn用户
  7. HDU 2444 The Accomodation of Students(判断是否可图 + 二分图)
  8. 深入浅出CChart 每日一课——第十六课 实习之旅,百年老店之新锐WTL
  9. hdu_2670Girl Love Value(dp)
  10. 用github展示自己的网页要做哪些准备(总结)
  11. visual studio vode 汉化
  12. BZOJ1023 SHOI2008 仙人掌图 仙人掌、单调队列
  13. Yii2上传图片插件使用
  14. Laravel 怎么使用资源控制器delete方法
  15. php中urlencode和urldecode的用法
  16. Linux 执行程序 报错误:Permission denied.
  17. 【Linux】percona-toolkit工具包的安装
  18. DELPHI之崩溃地址排错代码查看 转
  19. 【C#】使用MySql.Data.dll连接MySQL数据库
  20. 【JUnit】@Test 报错,&quot;Test cannot be resolved to a type&quot;

热门文章

  1. java数组实现买彩票(阿基老师的打乱排序思想)
  2. performClick()方法的使用
  3. CoreText的使用方法
  4. 【转】Java中,&amp;&amp;与&amp;,||与|的区别
  5. React Native for Android 学习
  6. AJPFX关于异常和file类的总结
  7. java之java.sql.SQLException: ResultSet is from UPDATE. No Data.
  8. R in action读书笔记(17)第十二章 重抽样与自助法
  9. KMP算法介绍
  10. struts2 前端显示错误信息