SDUT 2929 人活着系列之芳姐和芳姐的豬

SDUT 2929 人活着系列之芳姐和芳姐的豬

Time Limit: 1000MS Memory Limit: 65536KB

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


Example Input


3 4 5
2
3
4
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5

Example Output


8

Submit


#include <bits/stdc++.h>

#define INF 0x3f3f3f3f

const int MAXN = 610;

using namespace std;

int i, j;
int N, M, K;
int mp[MAXN][MAXN], s[MAXN];

void Floyd()
{
    for(int k = 1; k <= M; k++)
        for(int i = 1; i <= M; i++)
            for(int j = 1; j <= M; j++)
                mp[i][j] = min(mp[i][j],mp[i][k]+mp[k][j]);//求i, j兩豬圈最短路徑長
}

int main()
{
    scanf("%d %d %d", &N, &M, &K);
    for(i = 0; i < N; i++)
        scanf("%d", &s[i]);//豬分別在哪個豬圈
    memset(mp, INF, sizeof(mp));
    for(i = 0; i < MAXN; i++)
        mp[i][i] = 0;
    int u, v, w;
    for(i = 0; i < K; i++)
    {
        scanf("%d %d %d", &u, &v, &w);
        if(w < mp[u][v])
            mp[u][v] = mp[v][u] = w;//豬圈之間路徑長度
    }
    int Min = INF;
    Floyd();
    for(i = 1; i <= M; i++)
    {
        int sum = 0;
        for(j = 0; j < N; j++)//某豬圈到各個豬所在豬圈路徑長之和
        {
            sum += mp[i][s[j]];
        }
        if(sum < Min)
            Min = sum;
    }
    printf("%d\n", Min);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章