ShortestPath:Silver Cow Party(POJ 3268)

题目大意:一群牛在一块农田的不同的点,现在他们都要去到同一个地方开会,然后现在从那个地方回到原来的位置,点与点之间的连线都是单向的,并且通过一个路径需要一定时间,问你现在哪只牛需要最多的时间?
这一题可以这么看,回来的时候可以是从汇点(开会的地方)去到不同点的最短距离,然后从不同的点去的时候可以看做从汇点沿着路径的反方向看怎么走最短时间。
这样看这一题就简单很多了,因为没有负边,直接Dijkstra算法,算两次即可
#include <iostream>
#include <functional>
#include <algorithm>
#define MAX_N 1001
#define MAX_T 10000000 using namespace std; typedef int Position;
typedef struct edge_
{
int to;
int cost;
Position next;
}Edge;
typedef struct node_
{
Position point;
Position v;
int min_cost;
}Node; static Node Gragh_Head[MAX_N];
static Node Gragh_Head_rev[MAX_N];
static Edge Gragh_Edge[MAX_N *MAX_N];
static Edge Gragh_Edge_rev[MAX_N *MAX_N];
static Node heap[MAX_N];
static bool used[MAX_N]; void Search_Dijkstra(const int, const int);
int Delete_Min(int *const);
void Insert(Position, Node); int main(void)
{
int Node_sum, Path_sum, Goal_Farm, tmp_cost, tmp_to, tmp_start; while (~scanf("%d%d%d", &Node_sum, &Path_sum, &Goal_Farm))
{
for (int i = ; i <= Node_sum; i++)
{
Gragh_Head[i].point = -;
Gragh_Head_rev[i].point = -;
}
for (int i = ; i < Path_sum; i++)//邻接表储存
{
scanf("%d%d%d", &tmp_to, &tmp_start, &tmp_cost);//起点终点反过来
Gragh_Edge[i].to = tmp_to;//单向边,因为各个地方的牛要走到#X位置,相当于从#X走到各个点
Gragh_Edge[i].cost = tmp_cost;
Gragh_Edge[i].next = Gragh_Head[tmp_start].point;
Gragh_Head[tmp_start].point = i; Gragh_Edge_rev[i].to = tmp_start;//反向边存在另一个图中
Gragh_Edge_rev[i].cost = tmp_cost;
Gragh_Edge_rev[i].next = Gragh_Head_rev[tmp_to].point;
Gragh_Head_rev[tmp_to].point = i;
}
Search_Dijkstra(Node_sum, Goal_Farm);
}
return ;
} void Insert(Position pos, Node goal)
{
Position s = pos, pr; for (; s > ; s = pr)
{
pr = s % == ? s >> : (s - ) >> ;
if (heap[pr].min_cost > goal.min_cost) heap[s] = heap[pr];
else break;
}
heap[s] = goal;
} int Delete_Min(int *const size)
{
Position s1, s2, pr = , s;
Node out = heap[], tmp = heap[(*size)--]; for (; pr <= *size;)
{
s1 = pr << ; s2 = s1 + ;
if (s2 <= *size)
{
s = heap[s1].min_cost < heap[s2].min_cost ? s1 : s2;
heap[pr] = heap[s];
pr = s;
}
else if (s1 <= *size)
{
heap[pr] = heap[s1]; pr = s1;
break;
}
else break;
}
Insert(pr, tmp);
return out.v;
} void Search_Dijkstra(const int Node_sum, const int start)
{
int size = ;
Position V, adj_v; memset(used, , sizeof(used));
for (int i = ; i <= Node_sum; i++)
{
Gragh_Head[i].min_cost = MAX_T;
Gragh_Head[i].v = i;
}
Insert(++size, Gragh_Head[start]);
Gragh_Head[start].min_cost = ; while (size != )
{
V = Delete_Min(&size);
used[V] = ;
for (int k = Gragh_Head[V].point; k != -; k = Gragh_Edge[k].next)
{
adj_v = Gragh_Edge[k].to;
if (Gragh_Head[adj_v].min_cost > Gragh_Head[V].min_cost + Gragh_Edge[k].cost)
{
Gragh_Head[adj_v].min_cost = Gragh_Head[V].min_cost + Gragh_Edge[k].cost;
if (!used[adj_v])
Insert(++size, Gragh_Head[adj_v]);
}
}
} for (int i = ; i <= Node_sum; i++)
{
Gragh_Head_rev[i].min_cost = MAX_T;
Gragh_Head_rev[i].v = i;
}
memset(used, , sizeof(used));
size = ;//堆从0开始,反向边开始
Insert(++size, Gragh_Head_rev[start]);
Gragh_Head_rev[start].min_cost = ; while (size != )
{
V = Delete_Min(&size);
used[V] = ;
for (int k = Gragh_Head_rev[V].point; k != -; k = Gragh_Edge_rev[k].next)
{
adj_v = Gragh_Edge_rev[k].to;
if (Gragh_Head_rev[adj_v].min_cost > Gragh_Head_rev[V].min_cost + Gragh_Edge_rev[k].cost)
{
Gragh_Head_rev[adj_v].min_cost = Gragh_Head_rev[V].min_cost + Gragh_Edge_rev[k].cost;
if (!used[adj_v])
Insert(++size, Gragh_Head_rev[adj_v]);
}
}
}
int ans = -;
for (int i = ; i <= Node_sum; i++)
ans = max(ans, Gragh_Head[i].min_cost + Gragh_Head_rev[i].min_cost);
printf("%d\n", ans);
}

ShortestPath:Silver Cow Party(POJ 3268)的更多相关文章
- kuangbin专题专题四 Silver Cow Party POJ - 3268
题目链接:https://vjudge.net/problem/POJ-3268 题意:点X处开办排队,其他点的牛到X点去参加派对,然后从X点回到各自的点,通路是单向的,所有牛都要走最短路, 求出所有 ...
- Silver Cow Party POJ - 3268 (固定起点和固定终点的最短路)
思路:有向图.假设在X牧场参加party,从X回家的时候,以X为起点,使用一次Dijkstra算法即可.难点在于去X参加party的最短路如何求解. 这时候我们可以反向建图,即把原来有向图的方向全部反 ...
- Silver Cow Party POJ - 3268
#include<iostream> #include<queue> #include<cstring> using namespace std; +,INF=0x ...
- DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards
题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...
- POJ 3268 Silver Cow Party (双向dijkstra)
题目链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total ...
- POJ 3268 Silver Cow Party (最短路径)
POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...
- POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】
Silver Cow Party Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Su ...
- POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。
POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...
- POJ 3268 Silver Cow Party 最短路
原题链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total ...
随机推荐
- Python 之我见
读音 Python(KK 英语发音:/ˈpaɪθən/) 序言 其实早前就已经接触了python这个功能强大的脚本语言,但是那时只是基于兴趣而学习,目的性并不是很强,所以学习的并不是很深入.最近由于闲 ...
- (BZOJ4538)HNOI2016 网络
HNOI2016 Day1 T2 网络 Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做一条树边.两个服务器进行数据的交互时,数 ...
- ubuntu 14.04 vim install youcompleteme
sudo apt-get install vim ; sudo apt-get install vim-youcompleteme ; sudo apt-get install vim-addon-m ...
- 数组添加:如何往数组的"null"位置插入数据呢?
数组添加,当已经存在的一个数组时,如何往数组的"null"位置插入数据呢? 分析: 1.循环遍历数组元素,找出null的位置(下标) 2.设置一个变量,接收null位置下标值 3. ...
- HD1847 Good Luck in CET-4 Everybody!(巴什博弈)
巴什博弈: 一堆物品n个,最多取m个,最少取1个,最后取走的人获胜 分析:只要保证取玩最后剩m+1个,则必定胜利,所以构造m+1,只要n是 m+1的倍数,则先手必败,每次先手取玩,后手可取使得剩下的仍 ...
- IOC 构造函数注入vs属性注入
1.不管是构造函数注入还是属性注入,都要先把对象给new 出来,构造函数应该也是public.2.一般使用 配置文件,属性注入,不用使用特性,直接配置,初始化或依赖,凡是注入的,都要有访问权限,pub ...
- 采用httpclient提交数据到服务器
1)Get提交数据 效果演示:
- ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法
ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2015-02-11 中文名乱码是因为:FCKed ...
- 锋利的jQuery-7--query ui效果库--拖动排序插件sortable
一个简单的拖动排序效果,具体请参看jQuery ui官网demo. jquery ui :http://jqueryui.com/ sortable例子:http://jqueryui.com/sor ...
- hdu1114 Piggy-Bank (DP基础 完全背包)
链接:Piggy-Bank 大意:已知一只猪存钱罐空的时候的重量.现在的重量,已知若干种钱的重量和价值,猪里面装着若干钱若干份,求猪中的钱的价值最小值. 题解: DP,完全背包. g[j]表示组成重量 ...