人活着系列之芳姐和芳姐的猪
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
芳姐特别喜欢猪,所以,她特意养了n头猪,建了m个猪圈,顺便在m个猪圈间修了k条无向边,每条边有都有起点u,终点v,距离w。每头猪呆在一个特定的猪圈,有一个问题一直困扰着芳姐,那就是喂猪.....芳姐和猪们约定好,每天去一个固定猪圈去吃饭,芳姐为了不累着她可爱的猪们,想知道所有的猪吃饭走的最短路程是多少?
输入
第一行
: 三个数
,猪的个数
n(1<=n<=350),猪圈个数
m(
2<=m<=600),猪圈间道路数
k(1<=k<=1200).(猪的编号为
1..N,猪圈的编号为
1..m)
第n+2行到第n+k+1行:每行有三个数:相连的猪圈u、v,两猪圈间距离(1<=w<=255)
<p margin-bottom:="" "="" class="\"cjk\"" 0cm\?="">注:有的猪圈可能是空的,也可能有多头猪,保证 m个猪圈连通。输出
示例输入
3 4 5 2 3 4 1 2 1 1 3 5 2 3 7 2 4 3 3 4 5
示例输出
8
#include<map> #include<queue> #include<cmath> #include<iostream> #include<cstdio> #include<stack> #include<cstring> #include<algorithm> #define LL int #define inf 0x3f3f3f3f #define ls l,mid,rt<<1 #define rs mid+1,r,rt<<1|1 const double PI=acos(-1.0); using namespace std; int cer[700]; int mp[660][660]; void floyd(int n){ int i,j,k; for(k=1;k<=n;k++){ for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(mp[i][j]>mp[i][k]+mp[k][j]) mp[i][j]=mp[i][k]+mp[k][j]; } } } } int main(){ int a,b,c,n,m,i,j,k; while(~scanf("%d%d%d",&n,&m,&k)){ memset(cer,0,sizeof(cer)); for(i=1;i<=m;i++){ for(j=1;j<=m;j++){ i==j?mp[i][j]=0:mp[i][j]=inf; } } for(i=0;i<n;i++){ scanf("%d",&j); cer[j]++; } for(i=0;i<k;++i){ scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c){ mp[a][b]=mp[b][a]=c; } } floyd(m); int ans=inf; int t; for(i=1;i<=m;i++){ t=0; for(j=1;j<=m;j++){ if(mp[j][i]!=inf&&cer[j]!=0){ t+=(mp[j][i]*cer[j]); } } if(ans>t&&t!=0) ans=t; } printf("%d\n",ans); } return 0; }