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

输入
首先是一个正整数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

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

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

 # include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <cmath>
# include <queue>
# define LL long long
using namespace std ; const int INF=0x3f3f3f3f;
const int MAXN=;
struct qnode
{
int v;
int c;
qnode(int _v=,int _c=):v(_v),c(_c){}
bool operator <(const qnode &r)const
{
return c>r.c;
}
};
struct Edge
{
int v,cost;
Edge(int _v=,int _cost=):v(_v),cost(_cost){}
};
vector<Edge>E[MAXN];
bool vis[MAXN];
int ds[MAXN];
int de[MAXN];
int n ;
void Dijkstra(int start , int dist[])//点的编号从1开始
{
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++)dist[i]=INF;
priority_queue<qnode>que;
while(!que.empty())que.pop();
dist[start]=;
que.push(qnode(start,));
qnode tmp;
while(!que.empty())
{
tmp=que.top();
que.pop();
int u=tmp.v;
if(vis[u])continue;
vis[u]=true;
for(int i=;i<E[u].size();i++)
{
int v=E[tmp.v][i].v;
int cost=E[u][i].cost;
if(!vis[v]&&dist[v]>dist[u]+cost)
{
dist[v]=dist[u]+cost;
que.push(qnode(v,dist[v]));
}
}
}
}
void addedge(int u,int v,int w)
{
E[u].push_back(Edge(v,w));
} int main ()
{
//freopen("in.txt","r",stdin) ;
int m ;
int T ;
scanf("%d" , &T) ;
while (T--)
{
scanf("%d %d" , &n , &m) ;
int u , v , w ;
int i , j ;
for(i=;i<=n;i++)
E[i].clear(); while(m--)
{
scanf("%d%d%d" , &u , &v , &w) ;
addedge(u+,v+,w) ;
addedge(v+,u+,w) ;
}
int s , e ;
scanf("%d %d" , &s , &e) ;
Dijkstra(s+,ds) ;
Dijkstra(e+,de) ;
int Max = ;
for(i=;i<=n;i++)
if (ds[i] + de[i] > Max)
Max = ds[i] + de[i] ; printf("%d\n" , Max) ;
} return ;
}

最新文章

  1. 使用cmake自动构建工程
  2. Cleave.js – 自动格式化表单输入框的文本内容
  3. 手持移动扫描终端 PDA移动开单系统-批发零售管理
  4. [转]Android ListView 与 RecyclerView 对比浅析—缓存机制
  5. 用ProxyFactoryBean创建AOP代理
  6. array_unshift() 、
  7. 看苹果官方API
  8. MyBatis魔法堂:ResultMap详解
  9. AngularJS &#39;Controller As&#39;用法
  10. Educational Codeforces Round 16---部分题解
  11. 手机开机画面制作工具(LogoBuilder)
  12. iOS开发——UI_swift篇&amp;TableView实现页眉和页脚
  13. C++标准转换运算符const_cast
  14. 多线程程序设计学习(13)Active Object pattern
  15. iOS UIScrollView 你可能不知道的奇技淫巧
  16. java8的版本对组合式异步编程
  17. centos7破解安装confluence5.9.11
  18. win7(64位)Sql server 用T-sql读取本地数据文件dbf的数据文件
  19. centos7在upgrade的时候显示:Delta RPMs disabled because /usr/bin/applydeltarpm not installed
  20. Problem C: 默认参数:求圆面积

热门文章

  1. 【刷题】BZOJ 3724 PA2014Final Krolestwo
  2. 【题解】 bzoj1088: [SCOI2005]扫雷Mine (神奇的做法)
  3. 使用 Sixel 图形格式在终端中显示缩略图
  4. BZOJ2322 [BeiJing2011]梦想封印 【set + 线性基】
  5. 【bzoj3529】 Sdoi2014—数表
  6. 解题:NOIP 2018 保卫王国
  7. 【codevs1959】拔河比赛
  8. Easyui的DateBox日期格式化
  9. 纯CSS实现表单验证
  10. Comparing Differently Trained Models