http://poj.org/problem?id=1797

 

题意:现给出一些城市的街道,这些街道都从 1 - n 开始编号, 然后街道从 i - j 的负载量给你, 让你求 1 - n 最大的负载量。

例子:

   1                     从 1 - 2的负载量是3  从 2 - 3的负载量是5  综合考虑来说   1 - 3 的负载量为 3

   3 3                   但 例子中还有1 - 3 为4, 所以 1-3 的负载量 = max(3, 4)

   1 2 3                 其实也就是最短路的模板, 把最短路的条件改一下就行了。

   1 3 4                 

   2 3 5

 

注意输出格式, 在每个例子后要有一个空格。

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long LL;
#define oo 0x3f3f3f3f
#define maxn 1100
int maps[maxn][maxn], dist[maxn], v[maxn];
int n;

void Init()
{
    for(int i=1; i<=n; i++)
    for(int j=1; j<=n; j++)
     maps[i][j]=maps[j][i] = 0;
}

int Dij()
{
    memset(v, 0, sizeof(v));

    for(int i=1; i<=n; i++)
        dist[i] = maps[1][i];

        v[1] = 1;

    for(int i=1; i<n; i++)
    {
        int index, maxs = -1;
        for(int j=1; j<=n; j++)
        {
            if(maxs < dist[j] && !v[j])
            {
                maxs = dist[j];
                index = j;
            }
        }

        v[index] = 1;

        for(int j=1; j<=n; j++)
        {
            if(!v[j] && dist[j] <min(maps[index][j], maxs))
                dist[j] = min(maps[index][j], maxs);
        }
    }

    return dist[n];
}

int main()
{
    int T,  m, a, b, c, cnt=1;

    scanf("%d", &T);

    while(T --)
    {

      scanf("%d %d", &n, &m);
      Init();

      while(m --)
      {
          scanf("%d %d %d", &a, &b, &c);
          maps[a][b] = maps[b][a] =  c;
      }

      int ans = Dij();
      printf("Scenario #%d:\n", cnt++);
      printf("%d\n\n", ans);

    }

    return 0;
}
View Code

 

 

 

  

posted on 2016-07-18 17:04  不忧尘世不忧心  阅读(123)  评论(0编辑  收藏  举报