POJ

题意:给定一个下三角矩阵,询问从1开始到其他点的最短路径中,最长的那个是多少。

输入:N编号个数,然后对应 邻接矩阵的权值

思路:根据题意就是直接使用 dijkstra,因为是单源最短路且没有负权。然后把得到的dist 去循环一次找到最大的值即可

对于图的存储,由于编号数比较小,而且又是矩阵,所以直接开个邻接矩阵写了

完整题解:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath> 
#include <algorithm>

using namespace std;
const int maxn = 105;
const int inf = 0x3f3f3f3f;
typedef pair<int,int> pi;
int n;
int g[maxn][maxn];
int dist[maxn];
void init(){
    memset(dist,inf,sizeof(dist));
    memset(g,0,sizeof(g));
}
void dijkstra(int s){
    priority_queue<pi>Q;
    dist[s] = 0;
    Q.push(make_pair(0,s));
    while(!Q.empty()){
        s = Q.top().second;
        Q.pop();//直接用邻接矩阵来做
        for(int i=0;i<n;i++){
            if(i==s) continue;
            if(dist[i]>dist[s]+g[s][i]) {
                dist[i] = dist[s]+g[s][i];
                Q.push(make_pair(-dist[i],i));//更新 
            }
        }    
    }
} 
int trans(string s){
    int tmp = 0;
    if(s[0]=='x') return inf;
    else{
        for(int i=0;i<s.size();i++){
            tmp += (s[i]-'0')*pow(10,(s.size()-i-1));            
        }
        return tmp;
    }
}
int main(){

    while(cin>>n){
        init();
        //从0,0开始存图
        init();
        string s; 
        int i,j; i = j =0;
        for(i=0;i<n;i++){
            for(j=0;j<i;j++){
                cin>>s;
                g[j][i] = g[i][j] = trans(s);
            }
            g[i][j] = 0;
        }
        dijkstra(0);
        int ans = 0;
        for(int i=1;i<n;i++){
            ans = max(dist[i],ans);
        }
        cout<<ans<<endl;
    }
}
原文地址:https://www.cnblogs.com/Tianwell/p/11287905.html