考研机试:网络的核Floyd算法

版权声明:本博全为博主学习日常,均为原创,请勿转载 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;
} 

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44332298/article/details/88049541