北邮机试 | bupt oj | 272. 网络的核-计算机一2014

版权声明:本人小白,有错误之处恳请指出,感激不尽;欢迎转载 https://blog.csdn.net/stone_fall/article/details/88740631

题目描述

给定一个无向网络G,网络中共有N个节点(从1编号到N), M条边,求网络的核。
网络的核: 到网络中其他节点的距离之和最小的节点。且对于不连通的两点,它们之间的距离为N。
如果有多组解,输出编号最小的节点。

输入格式

输入的第一行是一个整数T(T≤25),表示输入的数据组数。
对于每组测试数据:

    第一行有两个整数N,M(1≤N≤50, 0≤M≤N*(N-1),表示网络中有N个点,M条边。
    接下来M行,每行两个整数u,v(1≤u,v≤N, u≠v),表示点u和点v之间有一条距离为1的边。任意两个点之间最多只会有一条边相连。

输出格式

对于每组测试数据,输出网络的核。

输入样例

2
3 3
1 2
1 3
2 3
4 2
1 2
2 3

输出样例

1
2

AC代码

#include<bits/stdc++.h> 
using namespace std;
#define MAXN 60
int a[MAXN][MAXN];
int main() {
	int t, n, m, u, v;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &n, &m);
		for (int i = 1; i<=n; i++) {
			for (int j = 1; j<=n; j++) {
				a[i][j] = n;
			}
		}
		for (int i = 1; i<=m; i++) {
			scanf("%d%d", &u, &v);
			a[u][v] = a[v][u] = 1;
		}
		for (int k = 1; k<=n; k++) {
			for (int i = 1; i<=n; i++) {
				for (int j = 1; j<=n; j++) {
					if (a[i][j]> a[i][k] + a[k][j])
						a[i][j] = a[i][k] + a[k][j];
				}
			}
		}
		int sum_min = 100000, core = 0;
		for (int i = 1; i<=n; i++) {
			int sum=0;
			for (int j = 1; j<=n; j++) {
				if(i!=j)sum +=a[i][j];
			}
			if (sum<sum_min) {
				sum_min = sum;
				core = i;
			}
		}
		printf("%d\n", core);
	}
	return 0;
}


 

猜你喜欢

转载自blog.csdn.net/stone_fall/article/details/88740631