题目连接:POJ 2594 Treasure Exploration
题目中有这么一句话:You should notice that the roads of two different robots may contain some same point.就是说不同路径可以有相交点,所以需要先用floyd求闭包,把间接相连的点直接连起来。
具体可以看一下这里:http://www.cnblogs.com/ka200812/archive/2011/07/31/2122641.html
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 500 + 50;
bool _map[MAX_N][MAX_N], vis[MAX_N];
int link[MAX_N], n, k;
void floyd()
{
for(int p = 1; p <= n; p++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(_map[i][p] == 1 && _map[p][j] == 1)
_map[i][j] = 1;
}
bool dfs(int u)
{
for(int i = 1; i <= n; i++)
{
if(!vis[i] && _map[u][i])
{
vis[i] = 1;
if(link[i] == -1 || dfs(link[i]))
{
link[i] = u;
return true;
}
}
}
return false;
}
int MaxMatch()
{
int num = 0;
memset(link, -1, sizeof(link));
for(int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
if(dfs(i))
num++;
}
return num;
}
int main()
{
while(scanf("%d%d", &n, &k), n + k)
{
memset(_map, 0, sizeof(_map));
int u, v;
for(int i = 0; i < k; i++)
{
scanf("%d%d", &u, &v);
_map[u][v] = 1;
}
floyd();
printf("%d\n", n - MaxMatch());
}
return 0;
}