您的位置:首页 > 其它

HUD3790最短路径问题(SPFA实现)

2013-04-20 21:36 375 查看
 HUD3790最短路径问题
 经过了几个晚上的苦战终于实现了spfa算法,并经过了诸多曲折写完了完整的AC代码。
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x7fffffff
using namespace std;

const int MAXN=1002;
struct Edge
{
int s,e,len,w;
}ind;
int map[MAXN][MAXN],dis[MAXN];
int cost[MAXN][MAXN],lowcost[MAXN];
void SPFA(int n,int start)
{
queue<int>q;
bool vis[MAXN];
int now=start;
memset(vis,false,sizeof(vis));
fill(dis,dis+MAXN,INF);
fill(lowcost,lowcost+MAXN,INF);
vis[start]=true;
dis[start]=lowcost[start]=0;
q.push(now);
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=false;
for(int i=1;i<=n;i++)
{
if(dis[i]-map[now][i]>dis[now])
{
dis[i]=dis[now]+map[now][i];
lowcost[i]=lowcost[now]+cost[i][now];
if(!vis[i])
{
q.push(i);
vis[i]=true;
}
}
else if(dis[i]-map[now][i]==dis[now]&&lowcost[i]-cost[i][now]>lowcost[now])
{
dis[i]=dis[now]+map[now][i];
lowcost[i]=lowcost[now]+cost[i][now];
if(!vis[i])
{
q.push(i);
vis[i]=true;
}
}
}
}
}
int main()
{
int n,m,i,start,end;
while(scanf("%d%d",&n,&m),(n||m))
{
memset(map,127,sizeof(map));
memset(cost,127,sizeof(cost));
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&ind.s,&ind.e,&ind.len,&ind.w);
//此处是判断是否有重边的存在,HUD中有好几题是如此处理的,因此需注意此用法。
if(ind.len<map[ind.s][ind.e])
{
map[ind.s][ind.e]=map[ind.e][ind.s]=ind.len;
cost[ind.s][ind.e]=cost[ind.e][ind.s]=ind.w;
}
else if(ind.len==map[ind.s][ind.e]&&ind.w<cost[ind.s][ind.e])
{
map[ind.s][ind.e]=map[ind.e][ind.s]=ind.len;
cost[ind.s][ind.e]=cost[ind.e][ind.s]=ind.w;
}
}
scanf("%d%d",&start,&end);
SPFA(n,start);
printf("%d %d\n",dis[end],lowcost[end]);
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: