poj 1797_迪杰斯特拉

题目描述:

道路x->y之间的权值表示允许容量。求从1出发,到达n点的最大允许通过容量为多少。(注意:为无向图)

解题思路:

做一次迪杰斯特拉。D[i]1->i的允许通过的容量值。每次选择容量最大的点,选进下一个点后更新点:D[j] = max(D[j], min(D[选择的点], G[选择的点][j]))。更新到n点即可成功退出。若未更新到n点,却发现找不到容量大于0的路,直接退出输出0

时间复杂度为O(v2)

代码:

#include <stdio.h>
#include <stdlib.h>
#define N 1001

int G[N][N];
int D[N], final[N];
int max_num(int x, int y)
{
   if(x>y)
      return x;
   else
      return y;
}
int min_num(int x,int y)
{
   if(x<y)
      return x;
   else
      return y;
}

main()
{
   int scenario;
   int max,tmp,i,j,s,n,m,x,y,temp;
  
   scanf("%d", &scenario);
   for(s=1;s<=scenario;s++)
   {
      scanf("%d %d",&n, &m);
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
            G[i][j] = 0;
      for(i=1;i<=m;i++)
      {
         scanf("%d %d", &x, &y);
         scanf("%d",&G[x][y]);
         G[y][x] = G[x][y];
      }
      //initial
      for(i=1;i<=n;i++)
      {
         D[i] = G[1][i];
         final[i] = 0;
      }
      final[1] = 1;
      //执行寻找最大容量
      for(i=2;i<=m;i++)
      {
         max = -1;
         tmp = 0;
         for(j=2;j<=n;j++)
            if(!final[j])
               if(max < D[j])
               {
                  tmp = j;
                  max = D[j];
               }
         if(tmp == n)
         {
            D[n] = max;
            final[n] = 1;
            break;
         }
         if(max == 0)
            break;
         final[tmp] = 1;
         for(j=2;j<=n;j++)
            if(!final[j])
               D[j] = max_num(D[j], min_num(D[tmp], G[tmp][j]));
      }
      printf("Scenario #%d:\n",s);
      printf("%d\n\n",D[n]);
   }
   //system("pause");
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值