G 最短路

题目描述
三国时期,南蛮王孟获叛乱,诸葛亮起兵平乱。
当深入南蛮之地时,遇当地人绘得地图,发现各地分别由各个寨主据守,若诸葛亮想兵分多路进军,尽快占领各个山寨(必须占领所有山寨),并且最终所有士兵都汇聚到孟获所在山寨,若给你一次穿越的机会,你用程序告诉诸葛亮最少需要多少天才能完成这个任务。假设军队足够多,各分队行军速度一样,且诸葛亮神机妙算,到达每个山寨即日可以攻克。

输入
首先是一个正整数T,接下来是T组测试数据,每组数据第一行是两个整数n,m(2=<n<=1000,1=<m<=10000),分别表示山寨数量和总边数,山寨编号0,1,2,3….n-1
接下来m行,每行三个整数i,j,k(0=<i,j<n,k<=10^4),分别表示山寨i和山寨j之间有一条路,在这条路上需要行军k天,接下来一行两个整数s,t(0<=s,t<=n-1),分别表示诸葛亮所在部队的起点和孟获山寨所在终点的编号

输出
对每组数据输出一个整数,表示诸葛亮的士兵占领所有山寨并汇聚到孟获所在山寨所需要的最少天数,每个输出独占一行


样例输入
2
5 6
0 1 2
1 2 2
3 1 2
4 0 3
3 2 3
3 4 1
4 3
5 5
1 0 1
1 2 3
1 3 3
4 2 2
3 4 1
4 2


样例输出
7
9

每支小分队都一个任务,从起点出发占领其他结点中的某一个点(每支小分队占的点都不同),占领该点立刻向终点出发,最后枚举所有小分队到达终点的时间,求最大值即可=.=


第一次想的时候想错了 我以为是从起点来一次最短路 找最大值 再从终点来一次最短路 找最大值 两个最大值相加 但样例没过=.=

 

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 # include <queue>
 7 # define LL long long
 8 using namespace std ;
 9 
10 const int INF=0x3f3f3f3f;
11 const int MAXN=1010;
12 struct qnode
13 {
14     int v;
15     int c;
16     qnode(int _v=0,int _c=0):v(_v),c(_c){}
17     bool operator <(const qnode &r)const
18     {
19         return c>r.c;
20     }
21 };
22 struct Edge
23 {
24     int v,cost;
25     Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
26 };
27 vector<Edge>E[MAXN];
28 bool vis[MAXN];
29 int ds[MAXN];
30 int de[MAXN];
31 int n ;
32 void Dijkstra(int start , int dist[])//点的编号从1开始
33 {
34     memset(vis,false,sizeof(vis));
35     for(int i=1;i<=n;i++)dist[i]=INF;
36     priority_queue<qnode>que;
37     while(!que.empty())que.pop();
38     dist[start]=0;
39     que.push(qnode(start,0));
40     qnode tmp;
41     while(!que.empty())
42     {
43         tmp=que.top();
44         que.pop();
45         int u=tmp.v;
46         if(vis[u])continue;
47         vis[u]=true;
48         for(int i=0;i<E[u].size();i++)
49         {
50             int v=E[tmp.v][i].v;
51             int cost=E[u][i].cost;
52             if(!vis[v]&&dist[v]>dist[u]+cost)
53             {
54                 dist[v]=dist[u]+cost;
55                 que.push(qnode(v,dist[v]));
56             }
57         }
58     }
59 }
60 void addedge(int u,int v,int w)
61 {
62     E[u].push_back(Edge(v,w));
63 }
64 
65 int main ()
66 {
67     //freopen("in.txt","r",stdin) ;
68     int m ;
69     int T ;
70     scanf("%d" , &T) ;
71     while (T--)
72     {
73         scanf("%d %d" , &n , &m) ;
74         int u , v , w ;
75         int i , j ;
76         for(i=1;i<=n;i++)
77             E[i].clear();
78 
79          while(m--)
80         {
81             scanf("%d%d%d" , &u , &v , &w) ;
82             addedge(u+1,v+1,w) ;
83             addedge(v+1,u+1,w) ;
84         }
85         int s , e ;
86         scanf("%d %d" , &s , &e) ;
87         Dijkstra(s+1,ds) ;
88         Dijkstra(e+1,de) ;
89         int Max = 0 ;
90         for(i=1;i<=n;i++)
91             if (ds[i] + de[i] > Max)
92                Max = ds[i] + de[i] ;
93 
94         printf("%d\n" , Max) ;
95     }
96 
97     return 0 ;
98 }
View Code

 

posted @ 2015-06-22 21:37  __Meng  阅读(277)  评论(0编辑  收藏  举报