BUPT复试专题—网络的核(2014)

题目描述

给定一个无向网络G,共有N个节点(1到N),M条边,求网络的核。

网络的核:到网络中其他节点距离之和最小的节点,且对于不连通的两点,他们之间的距离为N,若有多组解,输出编号最小的节点

输入

第一行是一个整数T表示测试数据的组数(<26)

对于每组测试数据:

第一行有两个整数N,M,表示N个点M条边

接下来M行,每行两个整数u,v(<=N),表示点u和v之间有一条距离为一的边,任意两点之间不会有重复边

输出

输出网络的核

样例输入

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

样例输出

1
2

来源

2014机考C题    转载请注明出处

#include <iostream>
#include <cstdio>
using namespace std;//Floyd
const int INFI=0x3f3f3f3f;
int dis[51][51];
int main()
{
    int i,j,k,n,m,p,q,s=1,T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        int INF=n;
        for (i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                dis[i][j]=INF;
            }
        }
        for (i=1; i<=m; i++)
        {
            scanf("%d%d",&p,&q);
            dis[p][q]=dis[q][p]=s;
        }
        for (k=1; k<=n; k++)
        {
            for (i=1; i<=n; i++)
            {
                for (j=1; j<=n; j++)
                {
                    if (dis[i][j]>dis[i][k]+dis[k][j])
                    {
                        dis[i][j]=dis[i][k]+dis[k][j];
                    }
                }
            }
        }
        //printf("%d
",dis[1][n]);
        int now=n,core=n,dist=INFI;
        while(now>0)
        {
            int temp=0;
            for(int i=1;i<=n;i++)
            {
                if(i==now)
                    continue;
                temp+=dis[now][i];
            }
            if(temp<=dist)
            {
                dist=temp;
                core=now;
            }
            now--;
        }
        cout<<core<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dzzy/p/8505166.html