COJ 0579 4020求次短路的长度

4020求次短路的长度
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

在一个地图上共有N个路口(编号分别为1到N),R条道路(道路均可以双向通行)。问1号路口到N号路口的次短路长度是多少?次短路指的是比最短路长度长的次短的路径。同一条边可以经过多次。


输入

第一行包括两个整数N、R,接下来的R行,每行三个数x,y和m,表示第x号路口到第y号路口的距离是m。

输出

一个数,表示次短路的长度。

输入示例

4 4
1 2 100
2 4 200
3 4 100
2 3 250

输出示例

450

其他说明

数据范围:1<=N<=5000,1<=R<=100000,0<m<10000.

题解:

方法1:窝萌可以用A*跑k短路对吧?

方法2:注意到是次短路,就枚举绕的边更新答案就行。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=5000+10,maxm=200000+10,inf=1e8;
11 struct ted{int x,y,w;ted*nxt;}adj[maxn<<1],*fch[maxn],*ms=adj;
12 void add(int x,int y,int w){
13     *ms=(ted){x,y,w,fch[x]};fch[x]=ms++;*ms=(ted){y,x,w,fch[y]};fch[y]=ms++;return;
14 }
15 int n,m;queue<int>Q;
16 struct solver{
17     bool inq[maxn];int d[maxn];
18     void spfa(int S){
19         for(int i=1;i<=n;i++)d[i]=inf,inq[i]=false;d[S]=0;queue<int>Q;Q.push(S);
20         while(!Q.empty()){
21             int u=Q.front();Q.pop();inq[u]=false;
22             for(ted*e=fch[u];e;e=e->nxt){
23                 int v=e->y;
24                 if(d[v]>d[u]+e->w){
25                     d[v]=d[u]+e->w;
26                     if(!inq[v])Q.push(v),inq[v]=true;
27                 }
28             }
29         }return;
30     }
31 }p1,p2;
32 inline int read(){
33     int x=0,sig=1;char ch=getchar();
34     for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)sig=0;
35     for(;isdigit(ch);ch=getchar())x=10*x+ch-‘0‘;
36     return sig?x:-x;
37 }
38 inline void write(int x){
39     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
40     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
41     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
42 }
43 int ans=inf,midist;
44 void init(){
45     n=read();m=read();int x,y,w;
46     for(int i=1;i<=m;i++){
47         x=read();y=read();w=read();add(x,y,w);
48     }
49     p1.spfa(1);p2.spfa(n);midist=p1.d[n];//write(midist);ENT;
50     return;
51 }
52 void work(){
53     int size=ms-adj-1;
54     for(int i=0;i<=size;i+=2){
55         int u=adj[i].x,v=adj[i].y,w=adj[i].w;
56         int d1=p1.d[u]+w+p2.d[v],d2=p2.d[u]+w+p1.d[v];
57         if(d1!=midist)ans=min(ans,d1);
58         if(d2!=midist)ans=min(ans,d2);
59     }
60     return;
61 }
62 void print(){
63     write(ans);
64     return;
65 }
66 int main(){init();work();print();return 0;}
时间: 2024-11-29 01:00:26

COJ 0579 4020求次短路的长度的相关文章

【Dijkstra+邻接表求次短路】POJ Sightseeing 3463

Language: Default Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7766   Accepted: 2766 Description Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the bus moves from one city S to

eoj1818 dijkstra求最短路及其条数

求出有n(1 < n <= 100)个结点有向图中,结点1到结点n的最短路径,以及最短路径的条数. Input 第一行有2个整数n和m( 0 < m < 3000),接下来m行每行有三个整数u,v,w结点u到v之间有一条权为w的边(w<100000). Output 输出只有一行,为结点1到结点n之间的最短路径及其条数(用空格隔开),如果1到n之间不存在路径,输出 -1 0. Sample Input 3 3 1 2 10 2 3 15 1 3 25 Sample Outpu

poj3255 次短路的长度

这道问题是求1-N的次短路的长度,我们直接在dist[maxn][2]上加1维更新即可, 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; const int maxn = 5000 + 10; int N, R; struct edge { int v, c

暴力求最短路

暴力求最短路 5 71 2 22 5 21 3 41 4 73 4 12 3 13 5 6 思路: 求1-5的最短距离找所有1可以直接到达的点,从这些点再去找5,并且记录我现在已经走了的长度如果找打5,就比较最短路输出最短路的最优值在某条路中,点被走过,就不能再走了 1 #include <bits/stdc++.h> 2 #define INFINITE 0x3fffffff 3 using namespace std; 4 struct node{ 5 int v; 6 int w; 7

BZOJ 1975 SDOI 2010 魔法猪学院 A*求K短路

题目大意:给出一张无向图,给出一个数值m,求出从1到N的前k短路的长度和>=数值m. 思路:注意!不能使用priority_queue,否则你会死的很惨..为了解惑,我去找了当年SD省选的原题,分明空间是256M,为什么BZOJ和BASHUOJ上都是64M??卡pq有意思么??? 思路很简单,就是按顺序求出这张图的前k短路,然后当m减成负数的时候就返回. CODE: #include <queue> #include <cstdio> #include <cstring

UVA 816 -- Abbott&#39;s Revenge(BFS求最短路)

 UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉点的方向(用NEWS表示不同方向)不同时, 允许出去的方向也不相同. 例如:1 2 WLF NR ER * 表示如果 进去时朝W(左), 可以 左转(L)或直行(F), 如果 朝N只能右转(R) 如果朝E也只能右转.* 表示这个点的描述结束啦! 输入有: 起点的坐标, 朝向, 终点的坐标.然后是各个

spfa求次短路

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

求最短路

求最短路 题目描述: 给定一张无向图,求一条经过边数最少的从点1到点N的最短路. 输入格式: 第一行两个整数N,M,表示点数和边数. 接下来M行每行三个整数,表示一条无向边的两端和它的边权.保证点的编号在[1, n]内. 输出格式: 一行两个整数,表示该最短路的长度,以及其经过的边数 如需输出64位整数,请使用cout或者printf("%I64d"). 样例输入: 3 3 1 2 1 2 3 1 1 3 2 样例输出: 2 1 提示: //虽然1->2->3也是最短路,但

hdu1869六度分离,spfa实现求最短路

就是给一个图,如果任意两点之间的距离都不超过7则输出Yes,否则 输出No. 由于之前没写过spfa,无聊的试了一下. 大概说下我对spfa实现的理解. 由于它是bellmanford的优化, 所以之前会bf的理解起来,可能会比较容易. 它是这样子的,你弄一个队列, 先打一个起点进去,之后求出的到各点的最短路, 都是由这个点出发的. 然后开始迭代,直至队列为空, 在迭代的过程中, 首先从队列里面拿一个点出来, 然后标记一下,说明这个点不在队列里面, 然后开始枚举所有点,进行松弛化, 松弛化的过程