用floyd求出图中每个点到其他点的最短路,再对每个点的最短路求和,最小的便是答案的起始点。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x1f1f1f1f
int W[105][105];
int G[105][105];
int n;
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
if(W[i][k]==INF) continue;
for(int j=1;j<=n;j++)
{
if(W[i][j]>W[i][k]+W[k][j])
W[i][j]=W[i][k]+W[k][j];
}
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
memset(G,0x1f,sizeof(G));
memset(W,0x1f,sizeof(W));
for(int i=1;i<=n;i++)
{
G[i][i]=0;
W[i][i]=0;
int m;
scanf("%d",&m);
int to,val;
for(int j=0;j<m;j++)
{
scanf("%d%d",&to,&val);
G[i][to]=val;
W[i][to]=val;
}
}
floyd();
long long cmpval=INF;
int cost=-1;
int ansn;
for(int i=1;i<=n;i++)
{
int cmpcost=-1;
long long temp=0;
for(int j=1;j<=n;j++)
{
//printf("G[%d][%d]=%d\n",i,j,G[i][j]);
temp+=W[i][j];
cmpcost=max(cmpcost,W[i][j]);
}
if(temp<cmpval)
{
cmpval=temp;
ansn=i;
cost=cmpcost;
}
}
if(cmpval>=INF) {printf("disjoint\n"); continue;}
else printf("%d %d\n",ansn,cost);
}
return 0;
}