| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
spfa求双向最短路再枚举每一条边的方法wa了 贴代码求解#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define maxv 10000
#define maxe 200000
#define INF 0x3f3f3f3f
int head[maxv],nn;//邻接表
int dist_s[maxv];//SPFA_s
int dist_e[maxv];//SPFA_e
bool visit[maxv];//SPFA
struct node//邻接表
{
int to;
int next;
int cost;
}E[maxe];
void addEdge(int a,int b,int pp)//邻接表
{
E[nn].cost=pp;
E[nn].to=b;
E[nn].next=head[a];
head[a]=nn++;
}
void SPFA_s(int start)
{
memset(dist_s,INF,sizeof(dist_s));//初始化distance数组
memset(visit,0,sizeof(visit));//初始化distance数组
dist_s[start]=0;
queue<int>Q;
//清空queue
while(!Q.empty()) Q.pop();
//
Q.push(start);
visit[start]=1;
while(!Q.empty())
{
int u=Q.front(); Q.pop();visit[u]=0;
for (int i=head[u];i!=-1;i=E[i].next)
{
if (dist_s[E[i].to]>dist_s[u]+E[i].cost)
{
dist_s[E[i].to]=dist_s[u]+E[i].cost;
if (visit[E[i].to]==0)
{Q.push(E[i].to);visit[E[i].to]=1;}
}
}
}
}
void SPFA_e(int end)
{
memset(dist_e,INF,sizeof(dist_e));//初始化distance数组
memset(visit,0,sizeof(visit));//初始化distance数组
dist_e[end]=0;
queue<int>Q;
//清空queue
while(!Q.empty()) Q.pop();
//
Q.push(end);
visit[end]=1;
while(!Q.empty())
{
int u=Q.front(); Q.pop();visit[u]=0;
for (int i=head[u];i!=-1;i=E[i].next)
{
if (dist_e[E[i].to]>dist_e[u]+E[i].cost)
{
dist_e[E[i].to]=dist_e[u]+E[i].cost;
if (visit[E[i].to]==0)
{Q.push(E[i].to);visit[E[i].to]=1;}
}
}
}
}
int main()
{
int N,R,A,B;
int D;
scanf("%d %d",&N,&R);
//初始化head数组
memset(head,-1,sizeof(head));
nn=1;
//读入,建图
for (int i=1;i<=R;i++)
{
scanf("%d %d %d",&A,&B,&D);
addEdge(A,B,D);//双向正边
addEdge(B,A,D);
}
//SPFA
SPFA_s(1);
SPFA_e(N);
//枚举每一条边
int ans=INF;
for (int i=1;i<=N;i++)
for (int j=head[i];j!=-1;j=E[j].next)
{
int temp=dist_s[i]+E[j].cost+dist_e[E[j].to];//temp=s->i+i->j+j->e
if (temp<ans&&temp>dist_s[N])//取大于最短路的最小值
ans=temp;
}
//输出
printf("%d\n",ans);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator