北郵機試 | bupt oj | 272. 網絡的 核-計算機一2014

網絡的核

題目描述

給定一個無向 網絡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;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章