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\n",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; }