Think: 求最短路徑問題, 數據小, 所以直接用Floyd算法
百年來,人活著是為了什么這個問題一直縈繞在人的腦海里,也一直困擾著人的思想。人活著就是活著了,為活著本身而活著,而不是為活著之外的任何事物而活著的。正因為活著,所以活著。對,是有點莫明其妙,但也是一句最受用的話。
芳姐特別喜歡豬,所以,她特意養了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
#include<bits/stdc++.h>#define MAX 0x3f3f3f;using namespace std;int Map[1050][1050];int quan[1050];void Floyd(int n);int main(){ int n, m, k; int a, b, c; int i, j; memset(Map, 0, sizeof(Map)); memset(quan, 0, sizeof(quan)); cin >> n >> m >> k; for (i = 1;i <= n;i ++) { cin >> quan[i]; } for (i = 0;i <= m;i ++) { for (j = 0;j <= m;j ++) { if (i == j) Map[i][j] = 0; else Map[i][j] = MAX; } } for (i = 1;i <= k;i ++) { cin >>a >> b >> c; if (Map[a][b] > c) { Map[a][b] = c; Map[b][a] = c; } } Floyd(m); int MIN = MAX; int sum; for (i = 1;i <= m;i ++) { sum = 0; for (j = 1;j <= n;j ++) { sum = sum + Map[i][quan[j]]; } if (MIN > sum) MIN = sum; } cout << MIN << endl; return 0;}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 ++) { Map[i][j] = min(Map[i][j], Map[k][i] + Map[k][j]); } } } }/***************************************************User name: Result: AcceptedTake time: 328msTake Memory: 2436KBSubmit time: 2017-02-20 11:25:56****************************************************/
|
新聞熱點
疑難解答