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

 

 

题意:这是一个下三角,上三角跟下三角图形一致,(若是完整的矩阵的话, 相当于 Map[i][j] 的距离为相对应的数值)这道题也一样。 不同的是 若 显示的为 ‘x’字母时, 说明Map[i][j]为正无穷, 两个点之间不通。 现在的问题是:求1到2, 1到3, .... 1到n 之中哪条路是最长的。

****

英语真的是太渣,表示看懂题意不是一般的难啊, 但是看懂题意后真的好简单 %>_<% 。。

不要再考我英语了,我诚实的说四级还没过  %>_<%。。。

 

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;

#define maxn 110
#define oo 0x3f3f3f3f
int maps[maxn][maxn], v[maxn], dist[maxn];
int n;

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

void Dij()
{
    memset(v, 0, sizeof(v));
    memset(dist, 0, sizeof(dist));
    for(int i=1; i<=n; i++)
        dist[i] = maps[1][i];
        v[1] = 1;

    for(int i=1; i<n; i++)
    {
        int index, mins = oo;

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

        v[index] = 1;

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

    int ans = 0;
     for(int i=1; i<=n; i++)
        ans = max(ans, dist[i]);

    printf("%d\n", ans);
}

int main()
{
    char str[maxn];
    int num;

    while(scanf("%d", &n)!=EOF)
    {

         Init();

        for(int i=2; i<=n; i++)
        {
            for(int j=1; j<i; j++)
            {
                scanf("%s", str);
               if(str[0] != 'x')
               {
                   sscanf(str, "%d", &num);
                   maps[i][j] = maps[j][i] = min(maps[i][j], num);
               }
            }
        }

        Dij();

    }

    return 0;
}
View Code

 

 

 

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