因为是路 所以 如果 1——3 2——3 3——4 3——5 则 1——4 1——5 2——4 2——5 都是是合法的 又因为机器人是可以相遇的 所以 我们把所有的点 分别放在左边和右边 去匹配 就能实现 路的连通性
连通的路一个机器人就能遍历所有的点 没有路的点需要一个一个的机器人去找。。。
注意是 n - 最大匹配 不是2n
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define N 510
int vis[N], used[N], maps[N][N], n, ans; void floyd()
{
for(int k=; k<=n; k++)
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
if(maps[i][k] && maps[k][j])
maps[i][j] = ;
} bool Find(int u)
{
for(int i=; i<=n; i++)
{
if(!vis[i] && maps[u][i])
{
vis[i] = ;
if(!used[i] || Find(used[i]))
{
used[i] = u;
return true;
}
}
}
return false;
}
int main()
{
int a, b, m;
while(scanf("%d%d", &n, &m), m+n)
{
memset(maps, , sizeof(maps));
for(int i=; i<m; i++)
{
scanf("%d%d", &a, &b);
maps[a][b] = ;
}
floyd();
ans = ;
memset(used, , sizeof(used));
for(int i=; i<=n; i++)
{
memset(vis, , sizeof(vis));
if(Find(i))
ans++;
}
printf("%d\n", n - ans);
}
return ;
}
过了很久之后再看这个题 竟然想不出来Floyd和相遇有啥关联
又想了一想
就拿2 - 5 为例
设图中匹配 为1 - 3 3 - 4
在没有Floyd前 2 和 5 分别要一个机器人
Floyd后 2 - 5 匹配 只需要一个就好了
那和相遇又有啥关系呢
在原图中2 - 5不是直达的边
2必须经过3才能到5
所以如果Floyd 那么从2到5 就必须经过3
而3已经有机器人通过了 所以就会相遇 (这里不考虑通过的时间点)
那为什么n - 最大匹配就是答案呢
自己画图慢慢想
我写给自己看的