網絡的核
題目描述
給定一個無向 網絡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;
}