poj 1797_迪杰斯特拉

来源:互联网 发布:java通过ip获取地区 编辑:程序博客网 时间:2024/06/16 15:52

题目描述:

道路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;
   intmax,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;
}

原创粉丝点击