poj1502 dijkstra


Sample Input

5
50
30 5
100 20 50
10 x x 10
Sample Output

35
题意:
给你一个临界矩阵,x表示两点间不可达,由于自身到自身话费时间为0,所以没有给出,由于i到j和j到i距离相同,互达时间相同,
所以只给出了一半的临界矩阵。根据给你的这个临界矩阵,让你来求从点1到其他点所花费时间的最大值。


#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<memory.h>
#include<cmath>
#define MaxN 110
#define MaxInt 200000000
using namespace std;
int map[MaxN][MaxN],dist[MaxN];
bool mark[MaxN];
int n,start,end;
char a[1000];
int main()
{
int min1,minj,temp;
while(scanf("%d",&n)!=EOF)
{
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    map[i][j]=map[j][i]=MaxInt;
    for(int i=2;i<=n;i++)
    for(int j=1;j<i;j++)
    {
        cin>>a;
        if(a[0]=='x')
        map[i][j]=map[j][i]=MaxInt;
        else
        {
            map[i][j]=0;
            int l;
            l=strlen(a);
            for(int k = 0;k < l;k++)

          {
             map[i][j] *= 10;
             map[i][j]+= (a[k] - 48);
          }

            map[j][i]=map[i][j];

        }
    }

for (int i=1;i<=MaxN;i++) dist[i]=MaxInt;
memset(mark,0,sizeof(mark));
dist[1]=0; //把起点并入集合,搜索时就可以从起点寻找到第一条最短的边了
//*********************************************
for (int i=1;i<=n-1;i++)
{
min1=MaxInt;
for (int j=1;j<=n;j++) //查找到原集合的最短的边
{
if (!mark[j]&&dist[j]<min1)
{
min1=dist[j];
minj=j;
}
}
mark[minj]=1;
for (int j=1;j<=n;j++) //每并入一个点都要对原来的边进行修正,保证任意时刻源点到目标点的距离都是最短的。
{
if (!mark[j]&&map[minj][j]>0)
{
temp=dist[minj]+map[minj][j];
if (temp<dist[j])
dist[j]=temp;
}
}
}
for(int i=2;i<=n;i++)
{
    if(dist[i]>dist[1])
    dist[1]=dist[i];
}

//***********输出***************
printf("%d\n",dist[1]);

 

}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值