
明显是最短路题目 (其实可以理解为找树的重心 有能力的自己了解吧!不写了有点麻烦!
这道题是点权值并不是之前最熟悉的边权值
然后我们初始化全部为INF然后联通的为1
我们只想要先计算最短路然后*每个点的权值
数据小 最短路什么方法都行吧 floyd简单好写自己跑!!!
const int MAX=1010;
int n;
int g[MAX][MAX];
int weight[MAX];
int main(){
cin>>n;
mms(g,INF);
for(int i=1;i<=n;i++){
int w,u,v;
cin>>w>>u>>v;
g[i][i]=0;
g[v][i]=1;
g[i][v]=1;
g[u][i]=1;
g[i][u]=1;
weight[i]=w;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(g[j][i]!=INF&&g[i][k]!=INF&&g[j][i]+g[i][k]<g[j][k]){
g[j][k]=g[j][i]+g[i][k];
}
}
}
}
int cnt=INF;
for(int i=1;i<=n;i++){
int ans=0;
for(int j=1;j<=n;j++){
if(g[j][i]>=INF) continue;
ans+=g[j][i]*weight[j];
}
cnt=min(cnt,ans);
}
cout<<cnt<<endl;
}
这篇博客介绍了如何使用Floyd算法解决点权值的最短路径问题,着重于找到树的重心并通过权值相乘得到答案。通过实例展示了从输入n个节点的图开始,计算每个节点到其他节点最短路径后加权求和的过程。
466

被折叠的 条评论
为什么被折叠?



