题意:地球人要到火星去寻宝,派机器人去战,每个机器人能走多条路,在每个点进行寻宝 为了使花费最小,所以要尽可能少的派机器人。
思路:刚开始以为是纯粹的DAG最小路径覆盖,WA 了 得用floyd传递闭包,把通路都连起来,因为机器人可以从一条路走到其它路上(有路的前提下) 然后就是求 最大匹配了
#include <stdio.h>
#include <string.h>
#define VM 505
int map[VM][VM],link[VM],vis[VM],XM[VM];
int n;
int DFS (int u)
{
int v;
for (v = 1;v <= n;v ++)
if (!vis[v]&&map[u][v])
{
vis[v] = 1;
if (link[v] == -1||DFS(link[v]))
{
link[v] = u;
XM[u] = v;
return 1;
}
}
return 0;
}
int hungary ()
{
int u,res = 0;
memset (link,-1,sizeof(link));
memset (XM,-1,sizeof(XM));
for (u = 1;u <= n;u ++)
if (XM[u] == -1)
{
memset (vis,0,sizeof(vis));
if (DFS(u))
res ++;
}
return res;
}
int main ()
{
int m,i,j,k,u,v;
while (scanf ("%d%d",&n,&m))
{
if (n == 0&&m == 0)
break;
memset (map,0,sizeof(map));
while (m --)
{
scanf ("%d%d",&u,&v);
map[u][v] = 1;
}
for (k = 1;k <= n;k ++)
for (i = 1;i <= n;i ++)
for (j = 1;j <= n;j ++)
if (map[i][k]&&map[k][j])
map[i][j] = 1;
int ans = hungary ();
printf ("%d\n",n - ans);
}
return 0;
}
思路:刚开始以为是纯粹的DAG最小路径覆盖,WA 了 得用floyd传递闭包,把通路都连起来,因为机器人可以从一条路走到其它路上(有路的前提下)
#include <stdio.h>
#include <string.h>
#define VM 505
int map[VM][VM],link[VM],vis[VM],XM[VM];
int n;
int DFS (int u)
{
}
int hungary ()
{
}
int main ()
{
}