版权声明:本博全为博主学习日常,均为原创,请勿转载 https://blog.csdn.net/weixin_44332298/article/details/88049541
题目分析
1、Floyd算法可以解决多源最短路径的问题,但是时间复杂度较高O(n3)。图中节点个数在100以下,使用Floyd不会超时。
2、用邻接矩阵表示即为每一行元素的和,找出最小值即可。
代码
//图中节点个数在100以下,使用Floyd就不会超时
#include <iostream>
using namespace std;
int main(){
int a[55][55];
int T, N, M, x1, x2, temp, min;
cin >> T;
while(T--){
cin >> N >> M;
for(int i = 1; i <= N; i++){ //初始化
for(int j = 1; j <= N; j++){
a[i][j] = N;
}
}
while(M--){
cin >> x1 >> x2;
a[x1][x2] = a[x2][x1] = 1;
} //无向图 两个都要赋值
//Floyd算法的主体
for(int k = 1; k <= N; k++){ //选取中间节点
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++){
if(a[i][k]==N || a[k][j]==N) //i到k不可达或者k到j不可达
continue;
if(a[i][k]+a[k][j] < a[i][j]){
a[i][j] = a[i][k]+a[k][j];
}
}
}
}
min = 100000000;
for(int i = 1; i <= N; i++){
int d = 0;
for(int j = 1; j <= N; j++){
d += a[i][j];
}
if(d < min){
min = d;
temp = i;
}
}
cout << temp << endl;
}
return 0;
}