1. 程式人生 > >人活著系列之芳姐和芳姐的豬 2929

人活著系列之芳姐和芳姐的豬 2929

人活著系列之芳姐和芳姐的豬

Problem Description
百年來,人活著是為了什麼這個問題一直縈繞在人的腦海裡,也一直困擾著人的思想。人活著就是活著了,為活著本身而活著,而不是為活著之外的任何事物而活著的。正因為活著,所以活著。對,是有點莫明其妙,但也是一句最受用的話。
芳姐特別喜歡豬,所以,她特意養了n頭豬,建了m個豬圈,順便在m個豬圈間修了k條無向邊,每條邊有都有起點u,終點v,距離w。每頭豬呆在一個特定的豬圈,有一個問題一直困擾著芳姐,那就是餵豬…芳姐和豬們約定好,每天去一個固定豬圈去吃飯,芳姐為了不累著她可愛的豬們,想知道所有的豬吃飯走的最短路程是多少?
Input
第一行: 三個數,豬的個數n(1<=n<=350),豬圈個數m(2<=m<=600),豬圈間道路數k(1<=k<=1200).(豬的編號為1…N, 豬圈的編號為1…m)
第二行到第N+1行: 1到N頭豬所在的豬圈號.
第n+2行到第n+k+1行: 每行有三個數:相連的豬圈u、v,兩豬圈間距離(1<=w<=255)
注:有的豬圈可能是空的,也可能有多頭豬,保證m個豬圈連通。
Output
Sample Input
3 4 5
2
3
4
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5
Sample Output
8

#include <stdio.h>
#include <stdlib.h>
#define INF 0x3f3f3f3f;
int a[666][666],b[355];
int main()
{
    int n,m,i,j,k,u,v,w,h;
    scanf("%d%d%d",&n,&m,&k);
    for(i=1;i<=n;i++)
        scanf("%d",&b[i]);
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=m;j++
) { if(i==j) a[i][j]=0; else a[i][j]=INF; } } for(i=1;i<=k;i++) { scanf("%d%d%d",&u,&v,&w); if(a[u][v]>w) a[u][v]=a[v][u]=w; } for(h=1;h<=m;h++) { for(i=1;i<=m;i++) { for
(j=1;j<=m;j++) { if(a[i][j]>a[i][h]+a[h][j]) a[i][j]=a[i][h]+a[h][j]; } } } int s,min=INF; for(i=1;i<=m;i++) { s=0; for(j=1;j<=n;j++) { s=s+a[b[j]][i]; } if(s<min) min=s; } printf("%d\n",min); return 0; }