题解:
1.数据量小,可以直接使用邻接矩阵存图,读题可知相邻节点的距离为1,而人数是节点的权值
2.先初始化邻接矩阵dis[i][j]=INF,dis[i][i]=0,输入时dis[i][l]=1,dis[l][i]=1…
3.直接使用Floyd算法,更新节点间的最短距离,及连通性
4.遍历所有节点,求出建立在哪个节点的距离和最小
上代码:
#include <iostream>
using namespace std;
const int INF=1000000;
int a[105][105];
int dis[105];
void init(){for(int i=1;i<=100;i++)for(int j=1;j<=100;j++) a[i][j]=INF,a[i][i]=0;}
void Floyed(int n)
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}
int main()
{
init();///初始化
int n;cin>>n;
for(int i=1;i<=n;i++)
{
int a1,b,d;
cin>>dis[i]>>a1>>b;
///输入图节点的数据
if(a1!=0)a[i][a1]=1,a[a1][i]=1;
if(b!=0) a[i][b]=1 ,a[b][i]=1;
}
int ans=INF*100+1;
Floyed(n);///更新节点间最小距离
for(int i=1;i<=n;i++)
{
int minn=0;
for(int j=1;j<=n;j++)
{
if(a[i][j]!=INF) minn+=a[i][j]*dis[j];///求出建立在节点i上的最小距离
}
if(ans>minn) ans=minn;///更新最小距离和
}
cout << ans << endl;
return 0;
}