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