后来发现这道题目的数据范围很小,可以用Floyd算法求的任意两点间的距离,暴力一下就可以过。
#include<iostream> #include<cstdio> #include<cstring> #include<functional> #include<algorithm> #define inf 0x3f3f3f3f #define maxn 105 using namespace std; int n,m,ans; int maps[maxn][maxn]; int num[maxn]; void init() { int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) maps[i][j]=0; else maps[i][j]=inf; } void floyd() { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(maps[i][j]>maps[i][k]+maps[k][j]) maps[i][j]=maps[i][k]+maps[k][j]; int main() { int i,j,a,b,c; while(scanf("%d",&n)!=EOF) { init(); for(i=1;i<=n;i++) { scanf("%d%d%d",&a,&b,&c); num[i]=a; maps[i][b]=1;//无向图 maps[b][i]=1; maps[i][c]=1; maps[c][i]=1; } floyd();//求任意两点间最短距离 int sum; ans=inf; for(i=1;i<=n;i++)//暴力枚举下每一种情况 { sum=0; for(j=1;j<=n;j++) sum+=(num[j]*maps[i][j]); ans=min(ans,sum); } printf("%d\n",ans); } }