网络的核
题目描述
给定一个无向 网络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;
}