树与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 */

 

posted @ 2021-12-09 23:02  matt-11  阅读(25)  评论(0)    收藏  举报