poj 3255 求次大最短路
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 5508 | Accepted: 2088 |
Description
Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along the way. She has decided to take the second-shortest rather than the shortest path. She knows there must be some second-shortest path.
The countryside consists of R (1 ≤ R ≤ 100,000) bidirectional roads, each linking two of the N (1 ≤ N ≤ 5000) intersections, conveniently numbered 1..N. Bessie starts at intersection 1, and her friend (the destination) is at intersection N.
The second-shortest path may share roads with any of the shortest paths, and it may backtrack i.e., use the same road or intersection more than once. The second-shortest path is the shortest path whose length is longer than the shortest path(s) (i.e., if two or more shortest paths exist, the second-shortest path is the one whose length is longer than those but no longer than any other path).
Input
Lines 2..
R+1: Each line contains three space-separated integers:
A,
B, and
D that describe a road that connects intersections
A and
B and has length
D (1 ≤
D ≤ 5000)
Output
N
Sample Input
4 4
1 2 100
2 4 200
2 3 250
3 4 100
Sample Output
450
Hint
Source
题目大意:在一个图上有许多个农场,有个人从1农场出发,到他的朋友n农场去,他不想走一条最短路径,这次他想换条路走,要你帮他找一条次短路径,次短路的定义是,比最短路径长度短(可能有多条),但是不会比其他的路径长度长。而且告诉你数据中一定存在至少一条次短路。
思路 :暴力每一条边
求出从起点到达该边的起点的最短距离 求终点到达该边的终点距离 相加再加上边长 判断是否比最短路长 且最接近最短路
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
const int INF=10000000;
const int maxn=5002;
struct Edge{
int from,to,dis;
};
struct node{
int d,u;
bool operator <(const node &rhs) const {
return d>rhs.d;//从小到大排列
}
};
int mn;
struct Dij
{
int n,m;//点数和边数
vector<Edge>edges;//边列表
vector<int>nd[maxn];//从每个节点出发的边编号 从0开始
bool vis[maxn];//是否参观过
int mmin[maxn];//s到各个点的最小距离
void init(int n)
{
this->n=n;
for(int i=0;i<n;i++) nd[i].clear();//邻接表清空
edges.clear();//清空边表
} void addedge(int from,int to,int dis)
//如果是无向图 每条无向边需要调用2次
{
edges.push_back((Edge){from,to,dis});//是{ 不是(
m=edges.size();
nd[from].push_back(m-1);
} void dij(int s)//求s到所有点的距离
{
priority_queue<node>que;
for(int i=0;i<n;i++) mmin[i]=INF;
mmin[s]=0;
memset(vis,0,sizeof(vis));
que.push((node){0,s});//注意符号 不是括号
while(!que.empty())
{
node x=que.top();que.pop();
int u=x.u;
if(vis[u]) continue;
vis[u]=true;
for(int i=0;i<nd[u].size();i++)
{
Edge& e=edges[nd[u][i]];
int max1=0,max2=0;
if(mmin[e.to]>mmin[u]+e.dis)
{
// printf("mmin[e.to]=%d\n",mmin[e.to]);
max1=mmin[e.to];
mmin[e.to]=mmin[u]+e.dis;
max2=mmin[e.to];
if(max1!=INF&&max2!=INF&&mn>max1-max2) mn=max1-max2;
que.push((node){mmin[e.to],e.to});
} }
}
}
}; vector<int>path;
int main()
{
int n,m,x,y,z,s,e;
while(scanf("%d %d",&n,&m)!=EOF)
{
mn=999999999;
s=0;e=n-1;
Dij solve[2];
solve[0].init(n);
solve[1].init(n);
while(m--)
{
scanf("%d %d %d",&x,&y,&z);
x--;y--;
solve[0].addedge(x,y,z);solve[0].addedge(y,x,z);
solve[1].addedge(x,y,z);solve[1].addedge(y,x,z);
}
solve[0].dij(s);//求1到所有点的距离
solve[1].dij(e);//求n到所有点的距离
int ans=INF;
for(int i=0;i<solve[0].edges.size();i++)
{
Edge &edge=solve[0].edges[i];
int st=edge.from,ed=edge.to;
int mid=solve[0].mmin[st]+solve[1].mmin[ed]+edge.dis;
if(mid>solve[0].mmin[e])
{
if(ans>mid) ans=mid;
}
}
printf("%d\n",ans);
}
return 0;
}
参考:
http://blog.csdn.net/wangjian8006/article/details/7992280
poj 3255 求次大最短路的更多相关文章
- POJ 3255:Roadblocks(次短路)
题目大意:求无向图的次短路. 分析: 在起点终点各求一次最短路,枚举边,通过该边的最短路为其权值加上到起点和终点最短路之和,找到最短但又比最短路长的路径. 代码: program block; typ ...
- 【POJ - 3255】Roadblocks(次短路 Dijkstra算法)
Roadblocks 直接翻译了 Descriptions Bessie搬到了一个新的农场,有时候他会回去看他的老朋友.但是他不想很快的回去,他喜欢欣赏沿途的风景,所以他会选择次短路,因为她知道一定有 ...
- POJ 3255 Roadblocks(A*求次短路)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12167 Accepted: 4300 Descr ...
- POJ 3255 Roadblocks (次级短路问题)
解决方案有许多美丽的地方.让我们跳回到到达终点跳回(例如有两点)....无论如何,这不是最短路,但它并不重要.算法能给出正确的结果 思考:而最短的路到同一点例程.spfa先正达恳求一次,求的最短路径的 ...
- Remmarguts' Date POJ - 2449 (A*搜索|k短路)
"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...
- poj 1847 Tram【spfa最短路】
Tram Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12005 Accepted: 4365 Description ...
- POJ - 1062 昂贵的聘礼(最短路Dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Descr ...
- POJ 3255 Roadblocks (次短路模板)
Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS Memory Limit: 65536K Descriptio ...
- POJ - 3255 SPFA+邻接表求次短路径
题意:给出m条边 , n个顶点,u [ i ]到v [ i ] 的距离w [ i ],求除了最短路的那条最短的边的长度. 思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举 ...
随机推荐
- Word Search II 解答
Question Given a 2D board and a list of words from the dictionary, find all words in the board. Each ...
- apache FtpServer 整合spring部署
我们在项目中可能会出现这样的需求,使用ftp上传很大的文件后对需要对文件进行相应的逻辑处理,这时我们可以使用apache ftpServer来处理这段逻辑,只要我们做相应的部署和编写我们的逻辑代码,这 ...
- 【转】通过 ulimit 改善系统性能
概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段.ulimit 是一 ...
- QT_编程基础
简单介绍 Qt是一个由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架.它既能够开发GUI程式,也可用于开发非GUI程式,比方控制台工具和server. Qt是面向对象语言,易于扩展,而且同意组 ...
- C++类构造函数
一.概述 类是一种用户自定义的类型,声明一个类对象时,编译程序要为对象分配存储空间,进行必要的初始化.在C++中,这项工作是由构造函数来完成的. 大部分对象在使用之前没有正确的初始化是C++出错的主要 ...
- cocos2d-x(quick-lua)读取csv文件
一.准备一份csv文件 ID,Name,Des,Model ID,名字,描写叙述,图片模型 1,广告,www.benmutou.com,csv.png 2,否认,呵呵,广告什么的,我才不会加,good ...
- stagefright框架(六)-Audio Playback的流程
到目前为止,我们都只着重在video处理的部分,对于audio却只字未提.这篇文章将会开始audio处理的流程. Stagefright中关于audio的部分是交由AudioPlayer来处理,它是在 ...
- 动态根据checkbox 增加Dom
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" ...
- sql相关操作
1.两个不同数据库对应字段相应操作 //操作模版:insert into data2.table2(字段1,字段2,字段) select 字段j,字段k,字段m from data1.table1举例 ...
- ASP.NET属性之AssociatedControlID
AssociatedControlID 是用在Asp.Net 中的 Label 控件上.给label控件关联一个ASP.NET的控件,在点击 这个 LABEL的时候,所关联的ASP.NET控件会获得焦 ...