题意:

求 1-N 的第二长路,一条路可以重复走

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

思路:

一开始想的就是:

我只要在spfa中更新的时候记录 dis[1][i]的最小和次小就好啦;

其实每个权值都带一个附属权值就好了;

这样能解决的好少,光是重复就不行了;

正确思路:

思想类似dijkstra 算法里:每次取最小边然后更新一波,只不过这里最小边有两种罢了;

次短路要么从某个最短路过来,要么从某个次短路过来。对于从1过去的点,只要有被更新到最短路或者次短路,那么就要对所有的点都搞一遍,每次取最小的边,然后一直更新;
引我南哥的小代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <deque>
#include <map>
#define cler(arr, val) memset(arr, val, sizeof(arr))
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long LL;
const int MAXN = 5010+1;
const int MAXM = 240000;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
int d[MAXN][2],head[MAXN],tol;
bool vis[MAXN][2];
struct node
{
int u,v,val,next;
}edge[MAXM];
void addedge(int u,int v,int w)
{
edge[tol].u=u,edge[tol].v=v,edge[tol].val=w,edge[tol].next=head[u];
head[u]=tol++;
edge[tol].u=v,edge[tol].v=u,edge[tol].val=w,edge[tol].next=head[v];
head[v]=tol++;
}
void dij(int n)
{
for(int i=0;i<=n;i++)
d[i][0]=d[i][1]=INF,vis[i][0]=vis[i][1]=false;
d[0][0]=0;
while(true)
{
int v=-1,k;
int minlen=INF;
for(int u=0;u<n;u++)
{
for(int l=0;l<2;l++)
if(!vis[u][l]&&(v==-1||d[u][l]<minlen))
{
minlen=d[u][l];
k=l;
v=u;
}
}
if(v==-1) break;
vis[v][k]=true;
for(int i=head[v];~i;i=edge[i].next)
{
int u=edge[i].v;//目标
int cost=d[v][k]+edge[i].val;
if(cost<d[u][0])
{
d[u][1]=d[u][0];
d[u][0]=cost;
}
else if(cost<d[u][1]&&cost>d[u][0])
{
d[u][1]=cost;
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
int t,n,m,u,v,w,cas=1;
cin>>t;
while(t--)
{
cler(head,-1);
tol=0;
cin>>n>>m;
int a=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
a=max(a,u);
a=max(a,v);
u--,v--;
addedge(u,v,w);
}
dij(a);
printf("Case %d: %d\n",cas++,d[n-1][1]);
}
return 0;
}

lightoj 1099【dijkstra/BFS】的更多相关文章

  1. HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

    Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  2. Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】

    Help Hanzo (LightOJ - 1197) [简单数论][筛区间质数] 标签: 入门讲座题解 数论 题目描述 Amakusa, the evil spiritual leader has ...

  3. hdu 1026 Ignatius and the Princess I【优先队列+BFS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  4. 【openjudge】【搜索(bfs)】P4980拯救行动

    [描述:] 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@).墙壁(#).和守卫(x). 英勇的骑士(r)决定孤身一人 ...

  5. CodeVS 1226 倒水问题【DFS/BFS】

    题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...

  6. lightoj 1025【区间DP】

    题意: 给出一个word,求有多少种方法你从这个word清除一些字符而达到一个回文串. 思路: 区间问题,还是区间DP: 我判断小的区间有多少,然后往外扩大一点. dp[i,j]就代表从i到j的方案数 ...

  7. CDOJ 1964 命运石之门【最短路径Dijkstra/BFS】

    给定数字n,m(1<=n,m<=500000) 将n变为n*2花费2,将n变为n-3花费3,要求过程中所有数字都在[1,500000]区间内. 求将n变为m的最少花费 思路:建图 将每个数 ...

  8. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  9. HDU 2102 A计划【三维BFS】

    A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

随机推荐

  1. Java中Class.forName()的作用(转载)

    http://www.360doc.com/content/10/0712/10/1720440_38421273.shtml# 使用jdbc方式连接数据库时会使用一句代码Class.forName( ...

  2. 九度OJ 1133:学分绩点 (加权平均数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1333 解决:702 题目描述: 北京大学对本科生的成绩施行平均学分绩点制(GPA).既将学生的实际考分根据不同的学科的不同学分按一定的公式 ...

  3. react遇到的各种坑

    标签里用到<label for>的,for 要写成htmlFor 标签里的class要写成className 组件首字母一定要大写 单标签最后一定要闭合 如果html里要空格转义, 注意不 ...

  4. 笔记,将CString转换为数值

           ANSI UNICODE TCHAR int    atoi    _wtoi  _ttoi long       atol    _wtol _ttol double   atof   ...

  5. 使用 QWorker 做为计划任务引擎

    QWorker 提供了 Plan 函数来提供计划任务功能的支持.每个任务做为一个作业,可以在指定的时间点被触发执行.而 cron 作为 Linux 操作系统下计划任务的标准被广大用户所熟知,QWork ...

  6. 把tomcat写到Windows系统服务器的服务中

    首先准备一个免安装的tomcat服务器,和一个Windows系统. 在“C:\Windows\SysWOW64”中找到cmd.exe的执行文件,以管理员身份启动: 进入到tomcat的bin文件夹, ...

  7. pyinstaller-py2exe-cx_Freeze打包第一个wxPython程序HelloWorld

    pyinstaller 打包hello 7Mb ================= www.pyinstaller.org pip install pypiwin32 pip install pyin ...

  8. 远程请求json数据,list中显示

    public class MainActivity extends Activity { protected static final int WHAT_REQUEST_SUCCESS = 1; pr ...

  9. iOS 使用.xcworkspace文件管理代码和工程依赖(实现项目模块化)

    一.创建xcworkspace文件. 在cocoapods安装后,项目文件里都会多一个后缀为.xcworkspace的文件.打开这个文件就相当打开最初创建的项目了.那么这个文件也就是用来管理项目的,它 ...

  10. BZOJ 1619 [Usaco2008 Nov]Guarding the Farm 保卫牧场:dfs【灌水】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1619 题意: 给你一个n*m的地形图,位置(x,y)的海拔为h[x][y]. 一个山顶的定 ...