vijos p1027休息中的小呆

休息中的小呆

描述

當你們在考場中接受考驗(折磨?)的時候,小呆正在清閒(欠扁)地玩一個叫「最初夢想」的遊戲。遊戲描述的是一個叫pass的有志少年在不一樣的時空穿越對抗傳說中的大魔王chinesesonic的故事。小呆發現這個遊戲的故事流程設計得很複雜,它有着不少的分支劇情,但不一樣的分支劇情是能夠同時進行的,所以遊戲能夠由劇情和劇情的結束點組成,某些劇情必需要在一些特定的劇情結束後才能繼續發展。爲了體驗遊戲的完整性,小呆決定要看到全部的分支劇情——完成全部的任務。但這樣作會不會耽誤小呆寶貴的睡覺時間呢?因此就請你來解決這個問題了。小呆會給你一個劇情流程和完成條件的列表,其中第一行有一個數n(0<n<100),表示總共有n個劇情結束點,第二行一個數m(0<m<=120),表示由m個不一樣的劇情,下面的m行中每行有三個數i(0<i<=100),j(0<j<=100),k(0<k<=1000),表示從劇情結束點i必須完成一個耗費時間爲k的劇情才能到達劇情結束點j。注意,這m行中出現的1不是劇情結束點而是遊戲的開始,而n+1表示遊戲結束。你要告訴小呆完成整個遊戲至少須要多少時間以及要通過的全部可能的劇情結束點(按升序輸出)。樣例以下:ios

樣例1

樣例輸入1

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

樣例輸出1

7
1 2 3 5

限制

各個測試點1s測試

來源

Vivian Snow
From 正·蠢盟演義——戰略版 Fools-League Tacticsspa

思路:最短路徑變成最大路徑。設計

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 int n;
 8 int m;
 9 int a[130][130];
10 
11 void init()
12 {
13     int x,y,w;
14     scanf("%d",&n);     n++;
15     scanf("%d",&m);
16     for(int i=1;i<=m;i++)
17     {
18         scanf("%d%d%d",&x,&y,&w);
19         a[x][y]=w;
20     }
21 }
22 
23 void Floyd()
24 {
25     for(int k=1;k<=n;k++)
26         for(int i=1;i<=n;i++)
27             for(int j=1;j<=n;j++)
28                 if(i!=j)
29                     if(a[i][k]>0&&a[k][j]>0)
30                         a[i][j]=max(a[i][j],a[i][k]+a[k][j]);
31 }
32 
33 void output()
34 {
35     printf("%d\n",a[1][n]);
36     for(int i=1;i<=n;i++)
37         if(a[1][i]+a[i][n]==a[1][n])
38             printf("%d ",i);
39 }
40 
41 int main()
42 {
43     init();
44     Floyd();
45     output();
46 }
相關文章
相關標籤/搜索