【算法】最短路(spfa) 次短路

【题解】

正反跑两次SPFA,然后枚举每一条边,如果起点到一个端点的最短路+另一个端点到终点的最短路+长度 ≠ 最短路,则和答案比较,保存最小值。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=,maxm=,inf=0x3f3f3f3f;
struct edge{int u,v,w,from;}e[maxm*];
int n,m,first[maxn],dist[maxn],dis1[maxn],dis2[maxn],tot,q[maxn*];
bool vis[maxn];
void insert(int u,int v,int w)
{tot++;e[tot].u=u;e[tot].v=v;e[tot].w=w;e[tot].from=first[u];first[u]=tot;}
void spfa(int s)
{
memset(vis,,sizeof(vis));
memset(dist,0x3f,sizeof(dist));
int l=,r=;q[]=s;dist[s]=;vis[s]=;
while(l<=r)
{
int x=q[l++];
for(int i=first[x];i;i=e[i].from)
if(dist[x]+e[i].w<dist[e[i].v])
{
int y=e[i].v;
dist[y]=dist[x]+e[i].w;
if(!vis[y])
{
q[++r]=y;
vis[y]=;
}
}
vis[x]=;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
insert(u,v,w);
insert(v,u,w);
}
spfa();
for(int i=;i<=n;i++)dis1[i]=dist[i];
spfa(n);
for(int i=;i<=n;i++)dis2[i]=dist[i];
int ans=inf;
for(int i=;i<=tot;i++)
{
int x=e[i].u,y=e[i].v;
int now=dis1[x]+dis2[y]+e[i].w;
if(now>dis1[n]&&now<ans)ans=now;
now=dis1[y]+dis2[x]+e[i].w;
if(now>dis1[n]&&now<ans)ans=now;
}
printf("%d",ans);
return ;
}

spfa

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=,maxm=,inf=0x3f3f3f3f;
struct edge{int from,u,v,w;}e[maxm];
struct Node{int x,d;}cyc;
int n,m,first[maxn],tot,d[maxn],d_[maxn],s,t,anss,ans;
priority_queue<Node>q;
bool operator <(Node a,Node b)
{return a.d>b.d;}
void insert(int u,int v,int w)
{tot++;e[tot].u=u;e[tot].v=v;e[tot].w=w;e[tot].from=first[u];first[u]=tot;}
void dijkstra(int* d)
{
for(int i=;i<=n;i++)d[i]=inf;
d[s]=;
cyc.x=s,cyc.d=d[s];q.push(cyc);
while(!q.empty())
{
cyc=q.top();q.pop();
if(cyc.d!=d[cyc.x])continue;
int x=cyc.x;
for(int i=first[x];i;i=e[i].from)
if(d[e[i].v]>d[x]+e[i].w)
{
d[e[i].v]=d[x]+e[i].w;
cyc.x=e[i].v,cyc.d=d[e[i].v];
q.push(cyc);
}
}
anss=d[t];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
insert(u,v,w);
insert(v,u,w);
}
s=;t=n;
dijkstra(d);
s=n;t=;
dijkstra(d_);
int ans=inf;
for(int i=;i<=tot;i++)
{
if(d[e[i].u]+e[i].w+d_[e[i].v]>anss)
ans=min(ans,d[e[i].u]+e[i].w+d_[e[i].v]);
}
printf("%d",ans);
return ;
}

dijkstra

【BZOJ】1726 [Usaco2006 Nov]Roadblocks第二短路的更多相关文章

  1. Bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路 dijkstra,堆,A*,次短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 969  Solved: 468[S ...

  2. BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路( 最短路 )

    从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ---------------------------------------------------------------- ...

  3. BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...

  4. BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra

    Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...

  5. BZOJ 1726 [Usaco2006 Nov]Roadblocks第二短路:双向spfa【次短路】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1726 题意: 给你一个无向图,求次短路. 题解: 两种方法. 方法一: 一遍spfa,在s ...

  6. bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路【dijskstra】

    严格次短路模板,用两个数组分别维护最短路和次短路,用dijskstra,每次更新的时候先更新最短路再更新次短路 写了spfa版的不知道为啥不对-- #include<iostream> # ...

  7. 1726: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 835  Solved: 398[S ...

  8. BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 768  Solved: 369[S ...

  9. 最短路【bzoj1726】: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...

随机推荐

  1. UVALive - 6869 Repeated Substrings 后缀数组

    题目链接: http://acm.hust.edu.cn/vjudge/problem/113725 Repeated Substrings Time Limit: 3000MS 样例 sample ...

  2. 数据库集群之路二 MYCAT

    windows下安装配置并使用mycat 参考:http://www.cnblogs.com/parryyang/p/5758087.html 一 下载windows版本 https://github ...

  3. PokeCats开发者日志(十二)

      现在是PokeCats游戏开发的第六十一天的晚上,终于拿到软著权登记证书了!   看来易版权确实是个值得信赖的代办机构呢,400块花的不冤.

  4. ZOJ 1229 M-Gift?!

    https://vjudge.net/contest/67836#problem/M There is a beautiful river in a small village. N rocks ar ...

  5. 原生js移动端字体自适应方案

    自从进入新公司之后,就一直采用800的方案,也就是判断屏幕尺寸,大于800px是一种html字体处理方案,另一种方案是小于800px的html字体处理方案, 代码如下: (function(doc, ...

  6. navicat for mysql 10.1.7 注册码

    NAVN-LNXG-XHHX-5NOO名:组织:注册码:均为NAVN-LNXG-XHHX-5NOO 下载地址:http://www.cr173.com/soft/38153.html

  7. sublime Text3 如何自动排版代码

    安装 html beautiful 然后按ctrl+shift+alt+f

  8. 导入导出SQL数据库

    在需要导出的数据库名上右键,选择转储SQL-数据和结构 在需要导入的连接中新建相同名称的数据库,右键选择运行SQL文件,即可将数据库数据转储到新的数据库中

  9. 移除 ios 上 input 的默认样式

    input{ -webkit-appearance:none; }

  10. 「CodePlus 2017 12 月赛」白金元首与独舞

    description 题面 data range \[ 1 \leq T \leq 10, 1 \leq n, m \leq 200 , 0 \leq k \leq \min(nm, 300)\] ...