poj 2594 Treasure Exploration(f…

题意:地球人要到火星去寻宝,派机器人去战,每个机器人能走多条路,在每个点进行寻宝 为了使花费最小,所以要尽可能少的派机器人。

思路:刚开始以为是纯粹的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值