题意:给定一个下三角矩阵,询问从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; } }