您的位置:首页 > 其它

poj 3255 Roadblocks

2017-11-19 18:14 302 查看
http://poj.org/problem?id=3255

找第二短的路,次短路模板题。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 5010
#define maxm 100010
#define inf 1000000000

using namespace std;

int disa[maxn],disb[maxn];
int to[2*maxm],len[2*maxm],next[2*maxm],head[maxn],q[maxn];
bool vis[maxn];
int n,m,num;

void spfa()
{
memset(vis,0,sizeof(vis));
for (int i=1;i<=n;i++) disa[i]=disb[i]=inf;
int l=0,r=1;
disa[1]=0;vis[1]=1;q[1]=1;
while (l!=r)
{
l++;if (l==maxn) l=0;
int x=q[l];
for (int p=head[x];p;p=next[p])
{
bool w=0;
if (disa[x]+len[p]<disa[to[p]])
{
disb[to[p]]=min(disa[to[p]],disb[x]+len[p]);
disa[to[p]]=disa[x]+len[p];
w=1;
}
else if (disa[x]+len[p]>disa[to[p]] && disa[x]+len[p]<disb[to[p]])
{
disb[to[p]]=disa[x]+len[p];w=1;
}
else if (disa[x]+len[p]==disa[to[p]] && disb[x]+len[p]<disb[to[p]])
{
disb[to[p]]=disb[x]+len[p];w=1;
}
if (w && !vis[to[p]])
{
vis[to[p]]=1;
r++;if (r==maxn) r=0;
q[r]=to[p];
}
}
vis[x]=0;
}
}

void addedge(int x,int y,int z)
{
num++;to[num]=y;len[num]=z;next[num]=head[x];head[x]=num;
}

int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for (int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
}
spfa();
printf("%d\n",disb
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: