描述:

One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ XN). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects pairs of farms; road i requires Ti (1 ≤ Ti ≤ 100) units of time to traverse.

Each cow must walk to the party and, when the party is over, return to her farm. Each cow is lazy and thus picks an optimal route with the shortest time. A cow's return route might be different from her original route to the party since roads are one-way.

Of all the cows, what is the longest amount of time a cow must spend walking to the party and back?

Input

Line 1: Three space-separated integers, respectively: N, M, and X
Lines 2.. M+1: Line i+1 describes road i with three space-separated integers: Ai, Bi, and Ti. The described road runs from farm Ai to farm Bi, requiring Ti time units to traverse.

Output

Line 1: One integer: the maximum of time any one cow must walk.

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

Hint

Cow 4 proceeds directly to the party (3 units) and returns via farms 1 and 3 (7 units), for a total of 10 time units.
 

题解:

  要求的其实就是1-n的每个点到x以及从x回来的最短路之和的最大值。就可以用两次dijkstra算法求解,一次算从i到x,一次算从x到i,最后求得相加的最大值即可。

代码:

#include <iostream>
#include <stdio.h> using namespace std;
#define inf 1<<29
int n,m,x;
bool vis[];
int map[][];
int go[],dback[]; //go是从i—>x back是从x—>i int dijkstra()
{
int i,j,f,v;
for(i=;i<=n;i++)
{
vis[i]=;
go[i]=map[i][x];
dback[i]=map[x][i];
} for(i=;i<=n;i++)
{
f=inf;
for(j=;j<=n;j++)
{
if(!vis[j]&&dback[j]<f)
{
v=j;
f=dback[j];
}
}
vis[v]=;
for(j=;j<=n;j++)
if(!vis[j]&&map[v][j]+dback[v]<dback[j])
dback[j]=map[v][j]+dback[v];
} for(i=;i<=n;i++) vis[i]=; for(i=;i<=n;i++)
{
f=inf;
for(j=;j<=n;j++)
{
if(!vis[j]&&go[j]<f)
{
v=j;
f=go[j];
}
}
vis[v]=;
for(j=;j<=n;j++)
{
if(!vis[j]&&map[j][v]+go[v]<go[j])
go[j]=map[j][v]+go[v];
}
} f=-;
for(i=;i<=n;i++)
{
if(go[i]+dback[i]>f)
f=go[i]+dback[i];
}
return f;
} int main()
{
int a,b,c;
while(~scanf("%d%d%d",&n,&m,&x)){
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i!=j) map[i][j]=inf;
else map[i][j]=;
}
for(int i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=c;
}
printf("%d\n",dijkstra());
}
return ;
}
 
 

最新文章

  1. c#-SimHash匹配相似-算法
  2. Java线程池的那些事
  3. Ionic2 Tutorial
  4. 华丽的bootstrap3碰到土鳖IE6
  5. WebBrowser实现编辑网页
  6. Android Paint中setTextSize
  7. Android全屏显示
  8. vue+webpack项目实战
  9. linux top结果保存到文本上
  10. MicrosoftWebInfrastructure 之坑
  11. setting.py
  12. 关于单链表的增删改查方法的递归实现(JAVA语言实现)
  13. 【转】Js正则表达式
  14. SpringMVC-1-(简介及HelloWord)
  15. Alpha冲刺(4/10)——2019.4.27
  16. websocket 的客户端 websocket-sharp
  17. Cocos Creator 使用计时器(官方文档摘录)
  18. 大数据入门到精通11-spark dataframe 基础操作
  19. PHP 实现 word/excel/ppt 转换为 PDF
  20. Oracle体系结构之oracle密码文件管理

热门文章

  1. 【MongoDB异常】Exception authenticating MongoCredential解决方法
  2. Flutter自定义路由PageRouteBuilder
  3. WebStorm 2018激活码
  4. Maven常用命令汇总
  5. 标准3层神经网络搭建Demo
  6. 台达wplsoft2.34指令表
  7. 结巴分词出现AttributeError: &#39;float&#39; object has no attribute &#39;decode&#39;错误
  8. Java定义三个点Object...
  9. luogu4365 秘密袭击 (生成函数+线段树合并+拉格朗日插值)
  10. CF1153D Pigeon d&#39;Or