- 依旧没有什么特别难的
- 学了一下Folyd算法
- 主要注意顺序(先循环节点,保证都是最短路程)
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[101][101],f[101];
int main()
{
memset(a,0x3f,sizeof(a));
cin>>n;
int l,r;
for(int i=1;i<=n;i++){
a[i][i]=0;
cin>>f[i]>>l>>r;
if(l>0)a[i][l]=a[l][i]=1;
if(r>0)a[i][r]=a[r][i]=1;
}
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 m=0x7fffffff;
for(int i=1;i<=n;i++){
int s=0;
for(int j=1;j<=n;j++)
s+=f[j]*a[i][j];
m=min(m,s);
}
cout<<m<<endl;
return 0;
}