点这里看题目

3228K 485MS G++ 2453B

根据题意和测试用例知道这是一个求次短路径的题目。次短路径,就是比最短路径长那么一丢丢的路径,而题中又是要求从一点到指定点的次短路径,果断Dijkstra。

R (1 ≤ R ≤ 100,000,N (1 ≤ N ≤ 5000) ,length D (1 ≤ D ≤ 5000),所以我用链式向前星方法存储,这个不知道的点这里(我转载别人的,讲的挺详细)。

用一个二维数组dist[MAXN][2],去记录i->j的最短路径和次短路径,第二维是0表示当期拿记录最短边,是1表示当前记录次短边。思路是这样,dist初始值为INF,当if(!vis[j][0] && dis[j][0] < MIN),即找到最短边,标记下来;如果 else if(!vis[j][1] && dis[j][1] < MIN),则是次短边,标记下来。所后进行松弛操作。。。。

 /*************************************************************************
> File Name: poj3255.cpp
> Author: YeGuoSheng
> Description:
给定n个点和需要到达的点编号
问从1号点到目标点的次短路径
> Created Time: 2019年07月21日 星期日 16时40分46秒
************************************************************************/ #include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<stack>
#include<map>
#include<set>
#include<list>
#include<queue>
#include<string>
#include<algorithm>
#include<iomanip>
#define INF 0x3f3f3f3f
#define MAXN 50010 struct node
{
int v;
int next;
int w;
}edges[MAXN<<]; int head[MAXN];
int cnt;
int dis[MAXN][];//dist [i][0]:1 最短路径 ,dist[i][1]次短路径
bool vis[MAXN][];//vis[i][0]:1 表示到结点i的最短路径已找到,vis[i][1]表示到结点i的次短路径已找到
int n,m; void add(int u,int v,int w)//链式向前星存储
{
edges[++cnt].v=v;
edges[cnt].w=w;
edges[cnt].next=head[u];
head[u]=cnt;
} void dijkstra(int s)
{
for(int i=;i <= n;i++)
{
dis[i][]=dis[i][]= INF;//dist [i][0] 最短路径 ,dist[i][1]次短路径
vis[i][]=vis[i][]= ;
}
dis[s][] = ;
for(int i = ;i < n*;i++)
{
int MIN = INF;
int k = ;
int flag = ;
for(int j = ;j <= n;j++)
{
if(!vis[j][] && dis[j][] < MIN)
{
MIN=dis[j][];//找到最小边 将点标记
k=j;
flag = ;
}
else if(!vis[j][] && dis[j][] < MIN)//否则找到的就是次短边
{
MIN=dis[j][];
k=j;
flag = ;
}
}
if(MIN == INF)break;//没找到 最短或次短路径
vis[k][flag]=;//标记到结点k的最小边或次短边已经找到
for(int j= head[k];j!=-;j=edges[j].next)
{
int v = edges[j].v;//第j条边的终点
int w = edges[j].w;//这条边的权重
if(MIN+w <= dis[v][])//小于最短边,更新最短边,同时最短边变为次短边
{
dis[v][] = dis[v][];//既然dis[v][0]有更小的,那么我先把原来的赋值给dis[v][1]
dis[v][] = MIN+w;
}
else if(MIN+w <= dis[v][])//如果大于最短边,小于次短边,根新次短边
{
dis[v][] = MIN+w;
}
}
}
}
int main()
{
memset(head,-,sizeof(head));
cnt = ;
scanf("%d%d",&n,&m);// n:目标结点, m:边的数幂
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dijkstra();
printf("%d\n",dis[n][]);
return ;
}

POJ3255(Roadblocks)--次短路径的更多相关文章

  1. POJ 3255 Roadblocks --次短路径

    由于次短路一定存在,则可知次短路一定是最短路中某一条边不走,然后回到最短路,而且只是一条边,两条边以上不走的话,就一定不会是次短路了(即以边换边才能使最小).所以可以枚举每一条边,算出从起点到这条边起 ...

  2. POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16425   Accepted: 5797 Descr ...

  3. 【次短路径/SPFA】BZOJ1726-[Usaco2006 Nov]Roadblocks第二短路

    [题目大意] 求无向图点1到n的次短路. [思路] 一年多前写过一次堆优化Dijkstra的,方法就是一边跑Dijsktra一边就把次短路径保存下来.和一般Dijkstra不同的是把vis数组去掉了, ...

  4. 单源次短路径:poj:3255-Roadblocks

    Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17521 Accepted: 6167 Descripti ...

  5. 学习笔记CB006:依存句法、LTP、n元语法模型、N-最短路径分词法、由字构词分词法、图论、概率论

    依存句法分析,法国语言学家L.Tesniere1959年提出.句法,句子规则,句子成分组织规则.依存句法,成分间依赖关系.依赖,没有A,B存在错误.语义,句子含义. 依存句法强调介词.助词划分作用,语 ...

  6. windows短路径转换成长路径

    参考: https://blog.csdn.net/wxqian25/article/details/43951281 https://docs.microsoft.com/en-us/windows ...

  7. 【dijkstra优化/次短路径】POJ3255-Roadblocks

    [题目大意] 给出一张无向图,求出从源点到终点的次短边. [思路] 先来谈谈Dijkstra的优化.对于每次寻找到当前为访问过的点中距离最短的那一个,运用优先队列进行优化,避免全部扫描,每更新一个点的 ...

  8. POJ - 3255 次短路径

    题意:给你无向带权图,求次短路径 题解:加一个次短路的数组,用于距记录源点到此点的次短路长度,注意初始化是源点到自己的次短路是极大值 接着再使用dijkstra算法,它是每次选用现在连上(记录了)的点 ...

  9. A* 算法求第k短路径

    A*算法是一类贪心算法,其可以用于寻找最优路径.我们可以利用A*算法来求第k短路径. 一条路径可以由两部分组成,第一部分是一个从出发到达任意点的任意路径,而第二部分是从第一部分的末端出发,到终点的最短 ...

随机推荐

  1. android studio 运行按钮为灰色的解决办法之一

    sync project with gradle files按钮(如下图)同步一下就好了 3.2的  3.3同步按钮变成了一只大象+箭头

  2. 用filter求素数

    计算素数的一个方法是埃氏筛法, 所有的奇数: def _odd_iter(): n = 1 while True: n = n + 2 yield n 定义一个筛选函数: def _not_divis ...

  3. axios和drf结合的增删改查

    增删改查 查: 前端实例: mounted() { //获取所有数据 // var Base_url = 'http://paas.bktst.sh.sgcc.com.cn/t/files-check ...

  4. ES6深入浅出-13 Proxy 与 Reflect-3.Vue 3 将用 Proxy 改写

    如果说想打印出来年龄,但是有没有年龄的这个key值 把创建年龄写在一个按钮上面 通过一个事件来做. 点击创建年龄的按钮,给obj.age设置为18,但是页面的双向绑定并没有显示出来. 因为不响应式,为 ...

  5. CentOS7下yum安装Redis

    (1).Redis概述 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value(键值型)数据库(非关系型数据库),并提供多种语言的API. Redi ...

  6. Spring Cloud 如何实现服务间的调用 4.2.3

      如果存在多个服务时,要怎么通过注册中心来实现服务之间的调用呢?接下来将通过一个用户和订单之间的调用案例,来演示Eureka Server中服务之间的调用. 搭建订单服务工程 在父工程xcservi ...

  7. 【Leetcode_easy】893. Groups of Special-Equivalent Strings

    problem 893. Groups of Special-Equivalent Strings 题意: 感觉参考代码也是有点问题的... 参考 1. Leetcode_easy_893. Grou ...

  8. vuex中mutations数据响应

    vuex中的mutation需遵守Vue的响应规则: 既然Vuex的store中的状态是响应式的,那么在我们变更状态时,监视状态的Vuex最好在state中初始化好所有的所需属性. 如果需要在对象上添 ...

  9. centos7下使用yum安装mysql5.7.10

    原文地址:http://www.mamicode.com/info-detail-503994.html CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql ...

  10. 【GStreamer开发】GStreamer基础教程16——平台相关的element

    目标 虽然GStreamer是跨平台的framework,但不是所有的element都是在所有平台下都有的.比如,音频和视频的sink都非常依赖于当前的window系统,根据当前的平台需要选择不同的e ...