1. 程式人生 > >1992 聚會

1992 聚會

one blog ron 最短時間 spfa 題目 small add output

1992 聚會

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold
題目描述 Description

小S 想要從某地出發去同學k的家中參加一個party,但要有去有回。他想讓所用的
時間盡量的短。但他又想知道從不同的點出發,來回的最短時間中最長的時間是多
少,這個任務就交給了你

輸入描述 Input Description

第一行三個正整數n, m, k(n是節點個數,m是有向邊的條數,k是參加聚會的地點
編號)( 1 ≤ n ≤ 1000 ,1 ≤ m ≤ 100,000)

第二行..m + 1行每行3個整數x,y,w 代表從x到y需要花w的時間 0<w<=100

輸出描述 Output Description

輸出從不同的節點出發的最短時間中最長的時間

樣例輸入 Sample Input

4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3

樣例輸出 Sample Output

10

數據範圍及提示 Data Size & Hint
 1 #include<cstdio>
 2 #include<algorithm>
 3
#include<cstring> 4 #include<queue> 5 using namespace std; 6 const int MAXN = 1010; 7 8 struct Edge{ 9 int to,w,nxt; 10 }e[100100]; 11 12 int dis[MAXN]; 13 int diss[MAXN]; 14 int head[MAXN]; 15 bool vis[MAXN]; 16 queue<int>q; 17 int n,m,k,cnt,ans; 18 19 void add(int
u,int v,int w) //從u到v有一條長度是w的邊 20 { 21 ++cnt; 22 e[cnt].to = v; 23 e[cnt].w = w; 24 e[cnt].nxt = head[u]; 25 head[u] = cnt; 26 } 27 28 void spfa(int k) 29 { 30 memset(dis,0x3f,sizeof(dis)); 31 memset(vis,0,sizeof(vis)); 32 while (!q.empty()) q.pop(); 33 dis[k] = 0; 34 q.push(k); 35 vis[k] = true; 36 while (!q.empty()) 37 { 38 int u = q.front(); 39 q.pop(); 40 for (int i=head[u]; i; i=e[i].nxt) 41 { 42 int v = e[i].to; 43 int w = e[i].w; 44 if (dis[v]>dis[u]+w) 45 { 46 dis[v] = dis[u]+w; 47 if (!vis[v]) 48 { 49 q.push(v); 50 vis[v] = true; 51 } 52 } 53 } 54 vis[u] = false; 55 } 56 } 57 58 int main() 59 { 60 scanf("%d%d%d",&n,&m,&k); 61 for (int u,v,w,i=1; i<=m; ++i) 62 { 63 scanf("%d%d%d",&u,&v,&w); 64 add(u,v,w); 65 } 66 spfa(k); 67 for (int i=1; i<=n; ++i) 68 diss[i] = dis[i]; 69 for (int i=1; i<=n; ++i) 70 { 71 if (i!=k) spfa(i); 72 if (dis[k]<=10000000 && diss[i]<=10000000)ans = max(ans,dis[k]+diss[i]); 73 } 74 printf("%d",ans); 75 return 0; 76 }

1992 聚會