Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)A蔡老板的会议

题目描述

图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会。综合楼有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 } 

 

posted on 2016-11-23 09:07  左岸zero  阅读(613)  评论(0编辑  收藏  举报

导航