POJ 3255 Roadblocks【次短路】
2012-08-06 15:10
344 查看
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #define clr(x)memset(x,0,sizeof(x)) using namespace std; #define INF 0x1f1f1f1f struct node { int from,to,next,w; }e[1000000]; int tot; int head[5003]; void add(int s,int t,int wi) { e[tot].from=s; e[tot].to=t; e[tot].next=head[s]; e[tot].w=wi; head[s]=tot++; } struct dd { int xu,di; bool operator < (dd t)const{ return t.di<di; } }tt,in; priority_queue<dd>dis; void dijkstra(int s,int *d) { int i; in.xu=s; in.di=0; d[s]=0; dis.push(in); while(!dis.empty()) { tt=dis.top(); dis.pop(); for(i=head[tt.xu];i;i=e[i].next) { in.xu=e[i].to; in.di=tt.di+e[i].w; if(in.di<d[in.xu]) { d[in.xu]=in.di; dis.push(in); } } } } int d1[5004],d2[5003]; int main() { int n,m,i,j,a,b,c,mina,minb,tmp,t; while(scanf("%d%d",&n,&m)!=EOF) { clr(head); tot=1; while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } memset(d1,INF,sizeof(d1)); dijkstra(1,d1); memset(d2,INF,sizeof(d2)); dijkstra(n,d2); mina=minb=INF; for(i=1;i<tot;i++) { t=d1[e[i].from]+d2[e[i].to]+e[i].w; if(t<mina) { tmp=mina; mina=t; t=tmp; } if(t<minb&&t!=mina) minb=t; } printf("%d\n",minb); } return 0; }
题意: 给出一个 有 N 个节点和 M 条边的有向图,求出这幅图的次短路。
分析:先正向求出 1 到每个点的最短距离 d1[i] ,然后反向求出n 到每个点的最短距离d2[i],
在枚举每一条边 作为次短路径的边
次短路径存在于 d1[a]+ g[a][b]+d2[b] 中。
相关文章推荐
- poj 3255 Roadblocks(次短路)
- POJ 3255 Roadblocks(次短路模板题)
- poj 3255 Roadblocks 次短路 spfa 解题报告
- POJ - 3255 Roadblocks (次短路)
- POJ 3255 Roadblocks 次短路
- POJ 3255 Roadblocks(次短路)
- POJ - 3255 Roadblocks(最短路Dijkstra算法求次最短路)
- poj 3255 Roadblocks(次短路)
- hdu 6181 Two Paths(次短路径长度)POJ 3255 Roadblocks ( 次短路长度)
- POJ 3255 Roadblocks(次短路)
- POJ-3255 Roadblocks(次短路)
- POJ 3255 Roadblocks (次短路)
- POJ 3255 Roadblocks(次短路,Dijkstra变形+邻接表存储)
- POJ 3255 Roadblocks【次短路】
- POJ 3255 Roadblocks 次短路 SPFA
- poj 3255 Roadblocks (次短路+dijkstra)
- 【POJ】3255 Roadblocks(次短路+spfa)
- POJ-3255 Roadblocks (次短路)
- Poj 3255 Roadblocks【次短路】【大一最后一题】
- POJ 3255 Roadblocks 次短路