北邮机试 | 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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值