题目描述
图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会。综合楼有N (1<=N<=1000)间办公室,编号1~N每个办公室有一个部长在工(mo)作(yu),其中X号是蔡老板的办公室,会议也将在X(1<=X<=N)号办公室举行。综合楼的构造极其特殊,这N个办公室之间M(1<=M<=100,000)条单向走廊。通过第i条路将需要花费Ti(1<=Ti<=100)单位时间。
由于工作很忙,开完会之后各部长需要返回自己的办公室。他们会选择最短时间的最优路径。
为了合理安排接下来的工作,蔡老板想知道,【来回最久的】【!!!】那个部长在路上花费的时间是多少。
输入
第一行:用空格隔开的三个数N,M和X
接下来的M行:每行有用空格隔开的三个数Ai,Bi和Ti,表示从A点到B点花费的时间Ti
输出
一个int型的数,表示花费时间的最大值
样例输入
4 4 1
1 2 1
2 3 1
3 4 3
4 1 3
样例输出
8
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #define MAX 0xfffffff 6 using namespace std; 7 8 int m,n,x; 9 int vis[1005]; 10 int map1[1005][1005],dis1[1005]; 11 int map2[1005][1005],dis2[1005]; 12 13 void dijkstra1(int (*map)[1005],int *dis) 14 { 15 memset(vis,0,sizeof(vis)); 16 vis[x]=1; 17 for(int i=1;i<=n;i++) 18 { 19 dis[i]=map[x][i]; 20 } 21 for(int i=1;i<=n;i++) 22 { 23 int M=MAX,k=-1; 24 for(int j=1;j<=n;j++) 25 { 26 if(!vis[j]&&dis[j]<M) 27 M=dis[j],k=j; 28 } 29 if(k==-1) 30 return; 31 vis[k]=1; 32 for(int j=1;j<=n;j++) 33 { 34 if(!vis[j]&&dis[j]>dis[k]+map[k][j]) 35 dis[j]=dis[k]+map[k][j]; 36 } 37 38 } 39 } 40 41 int main() 42 { 43 while(scanf("%d%d%d",&n,&m,&x)!=EOF) 44 { 45 //memset(vis,0,sizeof(vis)); 46 for(int i=1;i<=n;i++) 47 { 48 for(int j=1;j<=n;j++) 49 map1[i][j]=map2[i][j]=i==j?0:MAX; 50 } 51 for(int i=1;i<=m;i++) 52 { 53 int a,b,t; 54 scanf("%d%d%d",&a,&b,&t); 55 if(map1[a][b]>t) 56 map1[a][b]=t; 57 if(map2[b][a]>t) 58 map2[b][a]=t; 59 } 60 dijkstra1(map1,dis1); 61 dijkstra1(map2,dis2); 62 for(int i=1;i<=n;i++) 63 { 64 dis1[i]=dis1[i]+dis2[i]; 65 } 66 sort(dis1+1,dis1+1+n); 67 printf("%d\n",dis1[n]); 68 69 } 70 return 0; 71 }