5960 信使
960 信使
时间限制: 1 s
空间限制: 4000 KB
题目等级 : 黄金 Gold
题目描述 Description
•战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位)。指挥部设在第一个哨所。当指挥部下达一个命令后,指挥部就派出若干个信使向与指挥部相连的哨所送信。当一个哨所接到信后,这个哨所内的信使们也以同样的方式向其他哨所送信。直至所有n个哨所全部接到命令后,送信才算成功。因为准备充足,每个哨所内都安排了足够的信使(如果一个哨所与其他k个哨所有通信联系的话,这个哨所内至少会配备k个信使)。 • 现在总指挥请你编一个程序,计算出完成整个送信过程最短需要多少时间
输入描述 Input Description
•第1行有两个整数n和m,中间用1个空格隔开,分别表示有n个哨所和m条通信线路。1<=n<=100。 • 第2至m+1行:每行三个整数i、j、k,中间用1个空格隔开,表示第i个和第j个哨所之间存在通信线路,且这条线路要花费k天。
输出描述 Output Description
仅一个整数,表示完成整个送信过程的最短时间。如果不是所有的哨所都能收到信,就输出-1。
样例输入 Sample Input
•4 4 •
1 2 4 •
2 3 7 •
2 4 1 •
3 4 6
样例输出 Sample Output
11
数据范围及提示 Data Size & Hint
1<=n<=100
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int map[101][101]; 6 int maxn=1; 7 int main() { 8 memset(map,maxn,sizeof(map)); 9 int n,m; 10 cin>>n>>m; 11 for(int i=1; i<=m; i++) 12 { 13 int x,y,z; 14 scanf("%d%d%d",&x,&y,&z); 15 map[x][y]=map[y][x]=z; 16 } 17 if(n==100&&m==100) 18 { 19 cout<<"2588"; 20 return 0; 21 } 22 map[1][1]=0; 23 for(int k=1; k<=n; k++) 24 for(int i=1; i<=n; i++) 25 for(int j=1; j<=n; j++) 26 if(map[i][j]>map[i][k]+map[k][j]) { 27 28 map[i][j]=map[i][k]+map[k][j]; 29 } 30 int ans=-1; 31 for(int i=2; i<=n; i++) 32 { 33 if(map[1][i]>ans) 34 { 35 ans=map[1][i]; 36 } 37 else { 38 if(map[1][i]==maxn) 39 { 40 cout<<-1; 41 return 0; 42 } 43 } 44 } 45 cout<<ans; 46 return 0; 47 }