题意
给定一个下三角矩阵,询问从1开始到其他点的最短路径中,最长的那个是多少?(其中x代表没路径)
解题思路
水题,dijkstra即可AC,唯一不同的是多一个字符串处理
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include<vector> #include<algorithm> #include<cstdio> #include<iostream> #include<set> #include<cstring> #include<map> #include<queue> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<int,pii> PII; const int maxn = 1e3+5; struct Edge { int to,cost; }; vector<Edge> G[maxn]; int dis[maxn]; bool vis[maxn]; int N;
void dijkstra() { memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); priority_queue<pii,vector<pii>,greater<pii> > Q; Q.push(pii(0,1)); dis[1] = 0; while(!Q.empty()){ pii t = Q.top(); Q.pop(); int u = t.second; int d = t.first; if(vis[u])continue; vis[u] = 1; for(int i=0;i<G[u].size();i++){ Edge e = G[u][i]; if(e.cost + d < dis[e.to]){ dis[e.to] = e.cost + d; Q.push(pii(dis[e.to],e.to)); } } } int ans = 0; for(int i=2;i<=N;i++){ ans = max(ans,dis[i]); } cout<< ans << endl; }
int main(int argc, char const *argv[]) { ios::sync_with_stdio(false); cin.tie(0); cin >> N; int t; cin.get(); string s; for(int j=2;j<=N;j++){ getline(cin,s); int k = 1; int len = s.size(); for(int i=0;i<len;i++){ int num = 0; if(s[i]==' ')continue; if(s[i]=='x'){ k++; continue; } while(s[i]>='0'&&s[i]<='9'){ num *= 10; num += (s[i]-'0'); i++; } G[k].push_back((Edge){j,num}); G[j].push_back((Edge){k,num}); k++; } } dijkstra(); return 0; }
|