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;}

 

posted @ 2015-07-23 08:43  AI_Believer  阅读(215)  评论(0编辑  收藏  举报