您的位置:首页 > 其它

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] 中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: