COJ 0579 4020求次短路的长度
2015-07-23 08:43
316 查看
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:注意到是次短路,就枚举绕的边更新答案就行。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<cstring> #define PAU putchar(' ') #define ENT putchar('\n') using namespace std; const int maxn=5000+10,maxm=200000+10,inf=1e8; struct ted{int x,y,w;ted*nxt;}adj[maxn<<1],*fch[maxn],*ms=adj; void add(int x,int y,int w){ *ms=(ted){x,y,w,fch[x]};fch[x]=ms++;*ms=(ted){y,x,w,fch[y]};fch[y]=ms++;return; } int n,m;queue<int>Q; struct solver{ bool inq[maxn];int d[maxn]; void spfa(int S){ for(int i=1;i<=n;i++)d[i]=inf,inq[i]=false;d[S]=0;queue<int>Q;Q.push(S); while(!Q.empty()){ int u=Q.front();Q.pop();inq[u]=false; for(ted*e=fch[u];e;e=e->nxt){ int v=e->y; if(d[v]>d[u]+e->w){ d[v]=d[u]+e->w; if(!inq[v])Q.push(v),inq[v]=true; } } }return; } }p1,p2; inline int read(){ int x=0,sig=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0; for(;isdigit(ch);ch=getchar())x=10*x+ch-'0'; return sig?x:-x; } inline void write(int x){ if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; int len=0,buf[15];while(x)buf[len++]=x%10,x/=10; for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; } int ans=inf,midist; void init(){ n=read();m=read();int x,y,w; for(int i=1;i<=m;i++){ x=read();y=read();w=read();add(x,y,w); } p1.spfa(1);p2.spfa(n);midist=p1.d ;//write(midist);ENT; return; } void work(){ int size=ms-adj-1; for(int i=0;i<=size;i+=2){ int u=adj[i].x,v=adj[i].y,w=adj[i].w; int d1=p1.d[u]+w+p2.d[v],d2=p2.d[u]+w+p1.d[v]; if(d1!=midist)ans=min(ans,d1); if(d2!=midist)ans=min(ans,d2); } return; } void print(){ write(ans); return; } int main(){init();work();print();return 0;}
相关文章推荐
- android基础:broadcast广播简单实例
- Win10用户不同设备的开始菜单、应用同步将取消 减少硬盘空间的浪费
- CoreData的简单使用
- [acg]
- JDBC连接数据库
- hdu2141_Can you find it?
- iOS 开发第一步 C语言基础之递归
- [Leetcode 34, Medium] Search for a Range
- 资源网站
- LeetCode OJ 之 Search a 2D Matrix II (二维矩阵查找)
- 结构型模式-装饰模式
- 7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io
- OC中字符串的提取与替换-四种不同方法实现
- coj1022_菜鸟与大牛
- Python的Lambda函数与排序
- COJ 0578 4019二分图判定
- 【暴力搜索】分数分解
- swap
- 置换群好题
- HDU 1707 简单模拟 Spring-outing Decision