【算法】最短路(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. OSG学习:转动的小汽车示例

    由于只是简单的示例,所以小汽车的模型也比较简单,是由简单的几何体组成. 代码如下: #include <osg\ShapeDrawable> #include <osg\Animat ...

  2. OSG学习:多重纹理映射

    #include<osgViewer\Viewer> #include<osg\Node> #include<osg\Geode> #include<osg\ ...

  3. sublime Remote_encoding cp1252

    "remote_encoding": "cp1252",才能连接远程ftp

  4. [计算机网络] TCP的拥塞控制

    引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止过多 ...

  5. [剑指Offer] 49.把字符串转换成整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0  [思路]考虑所有特殊情况 1.数字前面有空格,如s="    12 ...

  6. 【bzoj1704】[Usaco2007 Mar]Face The Right Way 自动转身机 贪心

    题目描述 农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K( ...

  7. JavaScript中Switch使用

    switch 语句用于基于不同的条件来执行不同的动作.使用 switch 语句来选择要执行的多个代码块之一. switch(n) { case 1: 执行代码块 1 break; case 2: 执行 ...

  8. linux文件服务器:samba服务器

    windows上,需要和linux虚拟机进行方便的文件交互,总结一下遇到的问题. 1.samba简介 windows和windows之间共享文件可以用“网上邻居”,linux和linux间共享文件用 ...

  9. [洛谷P4312][COCI 2009] OTOCI / 极地旅行社

    题目大意:有$n(n\leqslant3\times10^4)$个点,每个点有点权,$m(m\leqslant3\times10^5)$个操作,操作分三种: $bridge\;x\;y:$询问节点$x ...

  10. [洛谷P2495][SDOI2011]消耗战

    题目大意:有一棵$n(n\leqslant2.5\times10^5)$个节点的带边权的树,$m$个询问,每次询问给出$k(\sum\limits_{i=1}^mk_i\leqslant5\times ...