[SPFA][jzyzoj1220]第二短路

  题面就不给了= =就是求从1到n的第二短路

  因为从1到1的路径还要再求一次,所以不能用dijkstra的方法进行松弛,这时候需要我们使用spfa

  以下是策略:

    1、当前求得最短路小于已知最短路时,先将第二短路进行更新(需要将新的第二短路和旧的最短路进行比较),再将第一短路进行更新;

    2、当前求得最短路等于已知最短路时,将第二短路进行更新(需要将新的第二短路与旧的第二短路进行比较);

    3、当前求得最短路大于已知最短路时,将第二短路进行更新(将求得最短路与第二短路进行比较);

  其余部分就是SPFA的模板了,代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 struct edge{
 6     int y,ne,v;
 7 }edge[200010];
 8 int d1[5010],d2[5010],n,m,head[5010],len=0,queue[200010];
 9 bool vis[5010];
10 inline void addedge(int x,int y,int v)
11 {edge[++len].y=y;    edge[len].v=v;    edge[len].ne=head[x];    head[x]=len;}
12 void init()
13 {
14     memset(head,-1,sizeof(head));
15     scanf("%d%d",&n,&m);
16     int x,y,v;
17     for (int i=1;i<=m;i++)
18     {
19         scanf("%d%d%d",&x,&y,&v);
20         addedge(x,y,v);
21         addedge(y,x,v);
22     }
23 }
24
25 void spfa()
26 {
27     memset(d1,0x3f,sizeof(d1));
28     memset(d2,0x3f,sizeof(d2));
29     memset(vis,false,sizeof(vis));
30     int Head=0,tail=1;
31     queue[1]=1;    d1[1]=0;    vis[1]=true;
32     while (Head<tail)
33     {
34         int tn=queue[++Head];
35         int te=head[tn];
36         vis[tn]=false;
37         for (int i=te;i!=-1;i=edge[i].ne)
38         {
39             int temp=edge[i].y;
40             if (d1[temp]>d1[tn]+edge[i].v)
41             {
42                 d2[temp]=min(d1[temp],d2[tn]+edge[i].v);
43                 d1[temp]=d1[tn]+edge[i].v;
44                 if (!vis[temp])
45                 {
46                     vis[temp]=true;
47                     queue[++tail]=temp;
48                 }
49             }
50             else
51             {
52                 if (d1[temp]==d1[tn]+edge[i].v)
53                 {
54                     d2[temp]=min(d2[tn]+edge[i].v,d2[temp]);
55                     if (!vis[temp])
56                     {
57                         vis[temp]=true;
58                         queue[++tail]=temp;
59                     }
60                 }
61                 else if (d2[temp]>d1[tn]+edge[i].v)
62                 {
63                     d2[temp]=min(d1[tn]+edge[i].v,d2[temp]);
64                     if (!vis[temp])
65                     {
66                         vis[temp]=true;
67                         queue[++tail]=temp;
68                     }
69                 }
70             }
71         }
72     }
73     printf("%d\n",d2[n]);
74 }
75
76 int main()
77 {
78     //freopen("add.in","r",stdin);
79     //freopen("add.out","w",stdout);
80     init();
81     spfa();
82     return 0;
83 }

AC代码

时间: 2024-08-04 14:15:30

[SPFA][jzyzoj1220]第二短路的相关文章

bzoj1726 [Usaco2006 Nov]Roadblocks第二短路

1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 826  Solved: 394[Submit][Status] Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的乡村有R(1<=R<=100,000)条双向

第二短路

oj1220 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个.贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地). 贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且,一条路可以重复走多

【最短路】LightOJ 1099 - Not the Best 第二短路

点击打开链接 题意:求第二短路,题目定义:一定要大于最短路      并且路可以重复走: 开二维数组 d[N][2] 分别记录最短路和第二短路 #include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <iostream> #include <algorithm> #include <sstream> #includ

1726: [Usaco2006 Nov]Roadblocks第二短路

1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 835  Solved: 398[Submit][Status] Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的乡村有R(1<=R<=100,000)条双向

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

从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ----------------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue&g

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

1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个.贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地). 贝茜选

spfa求次短路

思路:先算出每个点到1的最短路d1[i],记录下路径,然后枚举最短路上的边 删掉之后再求一遍最短路,那么这时的最短路就可能是答案. 既然这样为甚么不用A*求次短路呢?因为A*求次短路处理不了无向图啊,他会来回的走.ε=(′ο`*)))唉 上菜: 集合位置 题目描述 每次有大的活动,大家都要在一起"聚一聚",不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法永远是'S'--还有不能忘了,胖子

HDU1688 Sightseeing(SPFA 求最短路与次短路的路径条数)可用作模板

Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 718    Accepted Submission(s): 293 Problem Description Tour operator Your Personal Holiday organises guided bus trips across the Bene

【SPFA】 最短路计数

最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. [输出格式]   输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0. [输入样