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 ],求除了最短路的那条最短的边的长度. 思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举 ...
随机推荐
- poj 2411 Mondriaan's Dream(状态压缩dp)
Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...
- Unity 角色复活和重新开始游戏
作者写游戏完成的时候,还需要从新想下如何把游戏设置重新开始,角色如何复活. 一般大多数都会采用这种方式来代替游戏重新开始 Application.LoadLevel("xxx场景" ...
- 理解java设计模式之观察者模式
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...
- WinForm RDLC SubReport Step by step
最近在做的一个PO管理系统,因为要用到订单打印,没有用水晶报表,直接使用VS2010的Reporting.参考了网上的一些文章,但因为找到的数据是用于WebForm的,适配到WinForm有点区别,竟 ...
- 通过匹配绑定select option的文本值 模糊匹配
//通过匹配绑定select option的文本值 模糊匹配 $(".class option:contains('文本值')").attr("selected" ...
- 为net-snmp添加读readTimeTicks
function readTimeTicks(time){ if(time === 0) return ''; var d = 0, h = 0, m = 0, s = 0; d = parseInt ...
- 简单实现div+css页面自适应
Step1.在<head>添加如下代码<meta name="viewport" content="width=device-width, initia ...
- JS--Div中数据滚动到最后一条重新从头开始滚动
在做东西时要求让数据滚动,且滚动到最后一条时,从头再开始滚动,样图如下:
- java替换字符串和用indexof查找字符
java自带替换 String s="hlz_and_hourui哈哈"; String new_S=s.replaceAll("哈", "笑毛&qu ...
- Core Bluetooth下实现两个设备进行互联
一.外设管理者 - 发布广告 如果两部手机在BLE的基础上进行连接,需要让其中一部手机作为外设,外设需要进行广播自己需要发布的数据,以供中心设备的接收和处理. 实现外设广播数据并且处理发送过程当中的流 ...