有n个农场,编号1~N,农场里奶牛将去X号农场。这N个农场之间有M条单向路(注意),通过第i条路将需要花费Ti单位时间。选择最短时间的最优路径来回一趟,花费在去的路上和返回农场的这些最优路径的最长时间是多少?
思路:计算出每头牛去X并且回来的最短路径所需要的时间,然后求出这n-1个农场的牛的最长时间即可,两次运用dijkstra;
1 计算回来的时间:以X为源点,求出源点到各个农场的最短路径;
2 计算去的时间:将路径反转,在用一次djk,求源点到农场的最短路径(实则求牛去X的最短路径);
3 取两次和求最大值;

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 ≤ X ≤ N). 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: NM, and X 
Lines 2..M+1: Line i+1 describes road i with three space-separated integers: AiBi, 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.
 

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,x,minn,k,ans=0;
int dp[1005][1005];
int dis[1005],vis[1005],dis2[1005];
const int inf=99999999;
/*dijkstrak算法*/
void djk(int x)
{
for(int i=1;i<=n;i++)
vis[i]=0;
vis[x]=1;
for(int i=1;i<=n;i++)//记录点i到x的距离
dis[i]=dp[x][i];
for(int i=1;i<=n;i++)
{
minn=inf;
for(int j=1;j<=n;j++)//两个农场之间取最短的路径
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
k=j;
}
}
vis[k]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>dis[k]+dp[k][j])
dis[j]=dis[k]+dp[k][j];
}
}
}
int main()
{
while(scanf("%d %d %d",&n,&m,&x)!=EOF)//n头牛,m个例子,终点x;
{
for(int i=0;i<=n;i++)//这里i的范围要取小于n,如果取小于1005z则会runtime error
{//重置数组
for(int j=0;j<=n;j++)
  {
if(i==j)
dp[i][j]=0;//从i到i距离为0,else为inf;
   else
dp[i][j]=inf;
}
}
for(int i=0;i<m;i++)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
if(dp[u][v]>w)
dp[u][v]=w;
}
djk(x);
for(int i=1;i<=n;i++)
dis2[i]=dis[i];//记录distant函数之后的dis的数据 for(int i=1;i<=n;i++)//交换地图,路还是以前的路,只是起点和终点换了一下而已
{
for(int j=i+1;j<=n;j++)
{
int tem;
tem=dp[j][i];
dp[j][i]=dp[i][j];
dp[i][j]=tem;
}
}
djk(x);
for(int i=1;i<=n;i++)
{
ans=max(ans,dis2[i]+dis[i]);
}
printf("%d\n",ans);
}
}

B - B Silver Cow Party (最短路+转置)的更多相关文章

  1. POJ3268 Silver Cow Party(dijkstra+矩阵转置)

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15156   Accepted: 6843 ...

  2. POJ 3268 Silver Cow Party 最短路

    原题链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total ...

  3. POJ3268 Silver Cow Party —— 最短路

    题目链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total ...

  4. POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。

    POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...

  5. poj 3268 Silver Cow Party (最短路算法的变换使用 【有向图的最短路应用】 )

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13611   Accepted: 6138 ...

  6. (poj)3268 Silver Cow Party 最短路

    Description One cow ≤ N ≤ ) conveniently numbered ..N ≤ X ≤ N). A total of M ( ≤ M ≤ ,) unidirection ...

  7. poj 3268 Silver Cow Party(最短路dijkstra)

    描述: One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the bi ...

  8. TZOJ 1693 Silver Cow Party(最短路+思维)

    描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big ...

  9. Silver Cow Party(最短路,好题)

    Silver Cow Party Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Su ...

随机推荐

  1. “==”和equals的区别

    区别: (1)比较基本数据类型时 只能采用"==",比较的是数值; (2)当比较引用数据类型时 "==" 比较的是引用对象的内存地址; 而equals分两种情况 ...

  2. ios iphone 崩溃字符记录

    如题,近日iphone被爆出有一串字符可引发系统错误 (بٍٍٍٍََُُُِّّّْرٍٍٍٍََُُِِّّّْآٍٍٍَُّ بٍٍٍٍََُُُِّّّْرٍٍٍٍََُُِِّّّْآٍٍٍ ...

  3. PHP 获取重复数组中 第二多的元素

    $target = ["重复项目", "repeat", "repeat", "重复", "重复项目" ...

  4. 算法历练之路——传纸条(JAVA)

    传纸条 时间限制: 1Sec 内存限制: 128MB 提交: 36 解决: 16 题目描述小渊和小轩是好朋友也是同班同学,他们在一起 总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列 ...

  5. Head First 设计模式 —— 14. 复合 (Compound) 模式

    复合模式 在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题. P500 思考题 public interface Quackable { public void quack(); } p ...

  6. 【Web】CSS中的浮动float

    CSS中的float 文章目录 CSS中的float 1.float浮动属性 2.float文字环绕图片 3.float浮动的真正原因以及副作用分析 4.清除浮动的四种解决方法 5.实际应用 导航效果 ...

  7. 【数据库】MySQL & SQL 介绍

    文章目录 MySQL & SQL 介绍 1.MySQL的背景 2.MySQL的优点 3.MySQL的安装 4.MySQL服务的启动和停止 方式一 方式二 5.MySQL服务的登录和退出 方式一 ...

  8. 单片机—Arduino UNO-R3—学习笔记001

    连接方法 下载Arduino软件 安装完成打开如图所示 观察右下角的连接接口"Arduino Uno在COM(X)" 在工具-->端口-->选择之前查看的端口 即为连接 ...

  9. python--or 和 and 表达式

    or表达式: 两边为一真一假,返回真: 两边都为假,返回右边: 两边都为真,返回左边: and表达式: 两边为一真一假,返回假: 两边都为假,返回左边: 两边都为真,返回右边:

  10. 消息队列之rabbitmq学习使用

    消息队列之rabbitmq学习使用 1.RabbitMQ简介 1.1.什么是RabbitMQ? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,Rabb ...