- 题目
07-图4 哈利·波特的考试 (25分) - 分析
这道题就是一个多源有权无向图的最短路径问题,就是求出每个结点的最短路径,并得到其中的最小值。
这儿的结点数比较少(N<=100),所以我们可以采用简单的邻接矩阵表示,并采用Floyd算法来求解。 - 我的代码
#include<iostream>
using namespace std;
#define INFINITY 123456
#define MAXN 101
int Graph[MAXN][MAXN];
int dist[MAXN][MAXN];
int N,M;
void Flody()
{
int k,i,j;
for(k=1; k<=N; k++){
for(i=1; i<=N; i++){
for(j=1; j<=N; j++){
if(dist[i][k] + dist[k][j] < dist[i][j]){
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("hali.txt","r",stdin);
#endif
int i, j, x, y, weight;
scanf("%d%d", &N, &M);
for(i=1; i<=N; i++){
for(j=1; j<=N; j++){
if(i == j) Graph[i][j] = 0;
else Graph[i][j] = INFINITY;
}
}
for(i=1; i<=M; i++){
scanf("%d%d%d", &x, &y, &weight);
Graph[x][y] = weight;
Graph[y][x] = weight;
}
for(i=1; i<=N; i++){
for(j=1; j<=N; j++){
dist[i][j] = Graph[i][j];
}
}
Flody();
int minAnimal = -1, minDist = INFINITY;
for(i=1; i<=N; i++){
int tmp = 0;
for(j=1; j<=N; j++){
if(dist[i][j] > tmp) tmp = dist[i][j];
}
if(tmp == INFINITY){
printf("0\n");
return 0;
}
if(tmp < minDist){
minAnimal = i;
minDist = tmp;
}
}
printf("%d %d\n", minAnimal, minDist);
return 0;
}