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;
}