题目链接。
分析:
手感不错,1A。
直接穷举的起点, 求出不同起点到其它点最短路中最长的一条的最小值(好绕)。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 100+20; const int INF = (1<<28); int n, G[maxn][maxn], d[maxn]; int dijkstra(int s) { bool vis[maxn]; memset(vis, 0, sizeof(vis)); for(int i=0; i<n; i++) { d[i] = G[s][i]; } d[s] = 0; vis[s] = true; for(int i=0; i<n-1; i++) { int x, m = INF; for(int y=0; y<n; y++) if(!vis[y] && m >= d[y]) m = d[x=y]; vis[x] = true; for(int y=0; y<n; y++) if(!vis[y] && d[y] > d[x]+G[x][y]) { d[y] = d[x] + G[x][y]; } } int ans = -1; for(int i=0; i<n; i++) { if(i == s) continue; ans = max(ans, d[i]); } return ans; } int main() { int m, v, c; while(scanf("%d", &n) == 1 && n != 0) { for(int i=0; i<n; i++) for(int j=0; j<n; j++) G[i][j] = INF; for(int u=0; u<n; u++) { scanf("%d", &m); for(int i=0; i<m; i++) { scanf("%d %d", &v, &c); v--; G[u][v] = c; } } int ans = INF, k; for(int i=0; i<n; i++) { int res = dijkstra(i); if(res == -1) { ans = -1; break; } else if(ans > res) { ans = res; k = i; } } if(ans != INF) printf("%d %d\n", k+1, ans); else printf("disjoint\n"); } return 0; }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。