1. 程式人生 > >信使(msner)

信使(msner)

names tput for 最短時間 stream ron using freopen printf

題目描述

Description

戰爭時期,前線有n 個哨所,每個哨所可能會與其他若幹個哨所之間有通信聯系。信使負責 在哨所之間傳遞信息,當然,這是要花費一定時間的(以天為單位)。指揮部設在第一個哨所。當指揮部下達一個命令後,指揮部就派出若幹個信使向與指揮部相連 的哨所送信。當一個哨所接到信後,這個哨所內的信使們也以同樣的方式向其他哨所送信。直至所有n個哨所全部接到命令後,送信才算成功。因為準備充足,每個 哨所內都安排了足夠的信使(如果一個哨所與其他k個哨所有通信聯系的話,這個哨所內至少會配備k個信使)。
現在總指揮請你編一個程序,計算出完成整個送信過程最短需要多少時間。

Input

輸入文件 msner.in,第 1 行有兩個整數 n 和 m,中間用 1 個空格隔開,分別表示有 n 個 哨所和m條通信線路。1<=n<=100。 第 2 至 m+1 行:每行三個整數 i、j、k,中間用 1 個空格隔開,表示第 i 個和第 j 個哨所 之間存在通信線路,且這條線路要花費k 天。

Output

輸出文件 msner.out,僅一個整數,表示完成整個送信過程的最短時間。如果不是所有的 哨所都能收到信,就輸出-1。

Sample Input

4 4 
1 2 4 
2 3 7 
2 4 1 
3 4 6

Sample Output

11

題目分析

弗洛伊德跑一邊求出最短距離

單原點 以1為起點

找出從1開始 到每個點的最大長度

長度即時間 天數 最大長度即為所求

錯誤:

題目弄復雜

只要求出從1到每個點最大的長度來就可以了

枚舉每一個點到1的距離 如果有一個到1距離非常大的數

那麽就是1與這個點不連接

不能到達 傳遞信息 所以輸出-1

源代碼

 1 #include<iostream>
 2
#include<cstring> 3 #include<queue> 4 #include<algorithm> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 int n,m,s1,s2,s3,a[202][202],ans=0; 10 void floyed(); 11 void floyed_num(); 12 int main() 13 { 14 // freopen("msner.in","r",stdin);
15 // freopen("msner.out","w",stdout); 16 memset(a,0x3f,sizeof(a)); 17 scanf("%d%d",&n,&m); 18 for(int i=1;i<=m;i++) 19 { 20 scanf("%d%d%d",&s1,&s2,&s3); 21 a[s1][s2]=s3; 22 a[s2][s1]=a[s1][s2]; 23 } 24 floyed(); 25 for(int i=1;i<=n;i++) 26 if(a[1][i]>10000) 27 { 28 printf("-1"); 29 return 0; 30 } 31 for(int i=1;i<=n;i++) 32 if(a[1][i]>ans&&a[1][i]<10000) 33 ans=a[1][i]; 34 cout<<ans; 35 return 0; 36 } 37 void floyed() 38 { 39 for(int k=1;k<=n;k++) 40 for(int i=1;i<=n;i++) 41 for(int j=1;j<=n;j++) 42 if(a[i][j]>a[i][k]+a[k][j]&&i!=k&&i!=j&&k!=j) 43 { 44 a[i][j]=a[i][k]+a[k][j]; 45 a[j][i]=a[i][j]; 46 } 47 }

信使(msner)