Silver Cow Party
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 19325   Accepted: 8825

Description

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.
 
思路:单元最短路径,dijkstra算法,出发时分别以每一个点作为起点,搜索到达终点的最短路径;以及回来时从终点到达各点的最短路径,最后将来回两条路径长度取和,取其中的最大值。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<functional>
using namespace std;
typedef pair<int, int> P;
const int V_MAX = + ;
struct edge {
int to, time;
};
int V;
vector<edge>G[V_MAX];
int d[V_MAX];
int x[V_MAX];
void dijkstra(int s) {
priority_queue<P, vector<P>, greater<P>>que;
fill(d,d+V,INT_MAX);
d[s] = ;
que.push(P(,s));
while (!que.empty()) {
P p = que.top();que.pop();
int v = p.second;
if (d[v] < p.first)continue;
for (unsigned int i = ;i < G[v].size();i++) {
edge e = G[v][i];
if (d[e.to] > d[v] + e.time) {
d[e.to] = d[v] + e.time;
que.push(P(d[e.to],e.to));
}
}
}
} int main() {
int N, M,X;
scanf("%d%d%d", &N, &M, &X);
X--;
V = N;
for (int i = ;i < M;i++) {
edge E;
int from;
scanf("%d%d%d",&from,&E.to,&E.time);
from--;E.to--;
G[from].push_back(E);
}
dijkstra(X);
memset(x,,sizeof(x));
for (int i = ;i < V;i++) {
x[i] += d[i];
}
for (int i = ;i < V;i++) {
dijkstra(i);//以i点为中心,
x[i] += d[X];//计算i到目的地的最短距离并累加
}
int result = *max_element(x,x+V);
printf("%d",result);
return ;
}

这样用dijkstra算法搜索次数过多,耗时过多,看了hankcs博主的文章,很有启发,思路:分别以目的地为起点和终点,使用两次dijkstra算法即可,这样一来存路径时需要用两个数组,一个存正向路径,一个存反向路径,正向路径用于计算以目的地为起点时走到各点的最短路径,反向路径用于计算以目的地为终点时各点走到目的地的最短路径。

AC代码:

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<functional>
#include<string.h>
using namespace std;
typedef pair<int, int> P;
const int V_MAX = + ;
struct edge {
int to, time;
edge() {};
edge(int a,int b):to(a),time(b){}
};
int V;
vector<vector<edge>>G(V_MAX);//预定义容量,以防止越界
vector<vector<edge>>RG(V_MAX);
//vector<edge>G[V_MAX];
//vector<edge>RG[V_MAX];
int d[V_MAX];
int rd[V_MAX];
void dijkstra(int s) {
priority_queue<P, vector<P>, greater<P>>que;
fill(d,d+V,INT_MAX);
d[s] = ;
que.push(P(,s));
while (!que.empty()) {
P p = que.top();que.pop();
int v = p.second;
if (d[v] < p.first)continue;
for (unsigned int i = ;i < G[v].size();i++) {
edge e = G[v][i];
if (d[e.to] > d[v] + e.time) {
d[e.to] = d[v] + e.time;
que.push(P(d[e.to],e.to));
}
}
}
} int main() {
int N, M,X;
scanf("%d%d%d", &N, &M, &X);
X--;
V = N;
for (int i = ;i < M;i++) {
edge E;
int from,to,time;
scanf("%d%d%d",&from ,&to,&time);
from--;to--;
G[from].push_back(edge(to,time));
RG[to].push_back(edge(from,time));//存反向图
}
dijkstra(X);
//G = RG;
G.swap(RG);
memcpy(rd,d,sizeof(d));
dijkstra(X);
for (int i = ;i < V;i++) {
d[i] += rd[i];
}
int result = *max_element(d,d+V);
printf("%d",result);
return ;
}

poj 3268 Silver Cow Party的更多相关文章

  1. POJ 3268 Silver Cow Party (最短路径)

    POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...

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

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

  3. POJ 3268 Silver Cow Party (双向dijkstra)

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

  4. POJ 3268 Silver Cow Party 最短路

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

  5. POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】

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

  6. 图论 ---- spfa + 链式向前星 ---- poj 3268 : Silver Cow Party

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12674   Accepted: 5651 ...

  7. DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards

    题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...

  8. POJ 3268 Silver Cow Party (Dijkstra)

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13982   Accepted: 6307 ...

  9. POJ 3268 Silver Cow Party (最短路dijkstra)

    Silver Cow Party 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/D Description One cow fr ...

随机推荐

  1. 分享8款绚丽的HTML5/jQuery特效插件

    有几天没有分享前端资源了,今天要向大家分享15款非常给力的HTML5/jQuery特效插件,废话少说,一起来看看. 1.CSS3图片重力感应特效 很酷的一款CSS3模拟重力感应特效,你可以拖动图片来甩 ...

  2. js 处理url中文参数 java端接收处理

    正常情况下当http请求中带有中文参数时,浏览器会自动对中文进行一次编码(按照当前页面的pageEncoding),java端容器会对接收到的参数自动进行一次转码,则request.getParame ...

  3. 基于Raft构建弹性伸缩的存储系统的一些实践

    基于Raft构建弹性伸缩的存储系统的一些实践 原创 2016-07-18 黄东旭 聊聊架构 最近几年来,越来越多的文章介绍了 Raft 或者 Paxos 这样的分布式一致性算法,但主要集中在算法细节和 ...

  4. c#使用MethodInvoker解决跨线程访问控件

      功能函数测试集锦(77)  C#专区(114)  版权声明:本文为博主原创文章,未经博主允许不得转载. .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线 ...

  5. android图片特效处理之模糊效果

    这篇将讲到图片特效处理的模糊效果.跟前面一样是对像素点进行处理,算法是通用的,但耗时会更长,至于为什么,看了下面的代码你就会明白. 算法: 一.简单算法:将像素点周围八个点包括自身一共九个点的RGB值 ...

  6. iOS企业应用Profile制作流程

    第一步:企业版iDP申请完成以后,访问iOS Dev Center:https://developer.apple.com/devcenter/ios/index.action 第二步:点击Log I ...

  7. c#获得目标服务器中所有数据库名、表名、列名的实现代码

    /// <summary> /// 获得目标服务器所有数据库名 /// </summary> /// <param name="serverName" ...

  8. Python练习题 026:求100以内的素数

    [Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...

  9. 测试你是否和LTC水平一样高

    Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上!你的任务是:计算方程x^2+y^2+z^2= num的一个正整数解. ...

  10. Linux常用命令速查备忘

    Linux常用命令速查备忘   PS:备忘而已,详细的命令参数说明自己man 一. 启动,关机,登入,登出相关命令 [login] 登录 [logout] 登出 [exit] 登出 [shutdown ...