码迷,mamicode.com
首页 > 编程语言 > 详细

HDU ACM 3790最短路径问题(SPFA算法实现)

时间:2015-04-27 10:02:30      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   图论   

分析:同时计算最短距离和花费,距离相同时还要更新费用,还要同时存储正向边和反向边。

注意:不能用cin和cout,否则会超时。


#include<iostream>
#include<queue>
using namespace std;

int u[200002];
int v[200002];
int w[200002];
int p[200002];
bool vis[1001];
int d[1001];
int cost[1001];
int first[1001];
int Next[200002];

void Init(int n,int m)
{
	int i;

	for(i=1;i<=n;i++)
	{
		vis[i]=false;
		first[i]=-1;
	}
	for(i=0;i<m;i++)
		Next[i]=-1;
}

void spfa(int n,int s)    //flag表示当前处理的是反向建立后的图还是一开始的图,false反向,true开始
{
	queue<int> q;
	int i,x,y;

	for(i=1;i<=n;i++)
		d[i]=(i==s)?0:0x7fffffff;   //初始化,自己到自己为0,其他到自己相当于无穷大

	for(i=1;i<=n;i++)
		cost[i]=(i==s)?0:0x7fffffff;
	
	q.push(s);
	while(!q.empty())
	{
		x=q.front();
		q.pop();
		vis[x]=false;
		for(i=first[x];i!=-1;i=Next[i])
		{
			y=v[i];
			if(d[y]>d[x]+w[i] || d[y]==d[x]+w[i] && cost[y]>cost[x]+p[i])
			{
				d[y]=d[x]+w[i];
				cost[y]=cost[x]+p[i];
				if(!vis[y])
				{
					vis[y]=true;         
					q.push(y);
				}
			}
		}
	}
}

void Read(int m)
{
	int i,a,b;

	for(i=0;i<m;i++)
	{
		scanf("%d %d %d %d",&a,&b,&w[i],&p[i]);
		u[i]=a;                        //存储正向边,因为是无向图
		v[i]=b;
		Next[i]=first[a];
		first[a]=i;

		w[i+1]=w[i];                //存储反向边
		p[i+1]=p[i];
		i++;
		u[i]=b;
		v[i]=a;
		Next[i]=first[b];
		first[b]=i;
	}
}

void Output(int t)
{
	printf("%d %d\n",d[t],cost[t]);
}

int main()
{
	int n,m;
	int s,t;

	while(scanf("%d %d",&n,&m)==2 &&(n||m))
	{
		Init(n,m+m);  //m+m是因为无向边,每条都要保存两条
		Read(m+m);
		scanf("%d %d",&s,&t);
		spfa(n,s);
		Output(t);

	}
    return 0;    
}


HDU ACM 3790最短路径问题(SPFA算法实现)

标签:c   c++   acm   算法   图论   

原文地址:http://blog.csdn.net/a809146548/article/details/45290483

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!