树与floyd算法结合
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=105; 4 int dis[N][N]; 5 int val[N]; 6 int n; 7 int main() 8 { 9 memset(dis,0x3f,sizeof(dis)); 10 scanf("%d",&n); 11 for(int i=1;i<=n;i++) 12 { 13 int w,u,v; 14 scanf("%d%d%d",&w,&u,&v); 15 val[i]=w; 16 if(u)dis[i][u]=dis[u][i]=1; 17 if(v)dis[i][v]=dis[v][i]=1; 18 dis[i][i]=0; 19 } 20 for(int k=1;k<=n;k++) 21 for(int i=1;i<=n;i++) 22 for(int j=1;j<=n;j++) 23 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); 24 //用floyd暴力枚举每个点; 25 int ans=0x3f3f3f3f; 26 for(int i=1;i<=n;i++) 27 { 28 int sum=0; 29 for(int j=1;j<=n;j++) 30 { 31 if(i==j)continue; 32 sum+=dis[i][j]*val[j]; 33 } 34 ans=min(ans,sum); 35 } 36 37 cout<<ans<<endl; 38 return 0; 39 } 40 /* 41 5 42 13 2 3 43 4 0 0 44 12 4 5 45 20 0 0 46 40 0 0 47 */