think: 1今天感覺不知道怎么了,一直無法精神集中,題目之前看的時候其實沒想到直接用雙重for循環加Floyd算法就行,看題目的時候以為那樣會超時,今天看了別的博客,發現還是自己沒有嘗試,其實感覺題目需要注意的就是豬可能在不同的豬圈里,因此在用雙重for循環枚舉的時候要注意第二個for循環不要從豬圈總數開始枚舉,因為或許豬都在一個豬圈里,因此第二個for循環應該從有豬存在的豬圈開始枚舉
sdut原題鏈接
人活著系列之芳姐和芳姐的豬 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
Hint
Author cz
以下為accepted代碼
#include <stdio.h>#include <string.h>#define INF 0x3f3f3f3f#define Min(a, b) (a < b? a: b)int map[604][604], book[354];int n, m, k;void Floyd(){ int i, j, k; for(k = 1; k <= m; k++) { for(i = 1; i <= m; i++) { for(j = 1; j <= m; j++) { map[i][j] = Min(map[i][j], map[i][k] + map[k][j]); } } }}int main(){ scanf("%d %d %d", &n, &m, &k); memset(book, 0, sizeof(book)); for(int i = 1; i <= n; i++) { scanf("%d", &book[i]); } for(int i = 0; i <= m; i++) { for(int j = 0; j <= m; j++) { if(i == j) map[i][j] = 0; else map[i][j] = INF; } } for(int i = 0; i < k; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); if(map[u][v] > w) map[u][v] = map[v][u] = w; } Floyd(); int min = INF, sum; for(int i = 1; i <= m; i++) { sum = 0; for(int j = 1; j <= n; j++) { sum += map[i][book[j]]; } if(min > sum) min = sum; } printf("%d/n", min); return 0;}/***************************************************User name: Result: AcceptedTake time: 332msTake Memory: 1532KBSubmit time: 2017-02-20 17:41:46****************************************************/新聞熱點
疑難解答