有N头牛,有P个牧场,C条边。
农夫将一块糖放在某个牧场中,要求所有牛到达这个牧场的总距离最短。
赤裸裸的Floyd,然后枚举将糖放在每个点,统计牛要走的路。
/* ID: modengd1 PROG: butter LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> using namespace std; int haveCow[801];//每个牧场里牛的数量 int dis[801][801]; #define INF 2139062143 int main() { freopen("butter.in","r",stdin); freopen("butter.out","w",stdout); int N,P,C,temp,a,b,c; scanf("%d%d%d",&N,&P,&C); memset(haveCow,0,sizeof(haveCow)); memset(dis,0x7f,sizeof(dis)); for(int i=0;i<N;i++) { scanf("%d",&temp); haveCow[temp]++; } for(int i=0;i<C;i++) { scanf("%d%d%d",&a,&b,&c); if(c<dis[a][b]) { dis[a][b]=c; dis[b][a]=c; } } for(int k=1;k<=P;k++) { for(int i=1;i<=P;i++)if(dis[i][k]!=INF) { for(int j=1;j<=P;j++)if(dis[k][j]!=INF) { dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } dis[k][k]=0; } int ans=0x7fffffff; for(int i=1;i<=P;i++) { int temp=0; for(int j=1;j<=P;j++) { temp+=dis[i][j]*haveCow[j]; } ans=min(ans,temp); } cout<<ans<<endl; return 0; }
时间: 2024-11-18 19:04:38