一道很简单的题,但是题意不很好懂
题意的意思是给出一个带权有向图
让你找到一个起点,从这个起点到剩余所有点所用时间最短
输出这个起点和所用最短时间
对n个点用n次迪杰斯特拉即可
因为一个点到剩余所有点所用时间取决与最远的点
所以求出每个点所用时间,再取最小值即可
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 110
#define INF 0x3f3f3f3f
using namespace std;
int n;
bool vis[MAXN];
int d[MAXN], g[MAXN][MAXN];
int dijkstra(int s) {
memset(d, INF, sizeof(d));
memset(vis, false, sizeof(vis));
d[s] = 0;
for(int i=1; i<=n; ++i) {
int x, m = INF;
for(int j=1; j<=n; ++j)
if(!vis[j] && d[j]<m) {
m = d[x = j];
}
vis[x] = true;
for(int j=1; j<=n; ++j)
d[j] = min(d[j], d[x]+g[x][j]);
}
int ans = 0;
for(int i=1; i<=n; ++i)
ans = max(ans, d[i]);
return ans;
}
int main(void) {
int a, b, t, res, ans, tmp;
while(scanf("%d", &n), n) {
memset(g, INF, sizeof(g));
for(int i=1; i<=n; ++i) {
scanf("%d", &t);
while(t--) {
scanf("%d%d", &a, &b);
g[i][a] = b;
}
}
ans = INF;
for(int i=1; i<=n; ++i) {
tmp = dijkstra(i);
if(ans > tmp) {
ans = tmp;
res = i;
}
}
printf("%d %d\n", res, ans);
}
return 0;
}