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

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

注意:不能用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;
}
时间: 2024-08-12 16:30:05

HDU ACM 3790最短路径问题(SPFA算法实现)的相关文章

HDU ACM 3790 最短路径问题

欢迎"热爱编程"的高考少年--报考杭州电子科技大学计算机学院 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16300    Accepted Submission(s): 4898 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的

ACM: HDU 3790 最短路径问题-Dijkstra算法

HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是

hdu 2544 最短路(SPFA算法)

本题链接:点击打开链接 本题大意: 首先输入一个n,m.代表有n个点.m条边.然后输入m条边,每条边输入两个点及边权.1为起点,n为终点.输入两个零表示结束. 解题思路: 本题能够使用SPFA算法来做.此算法与dijkstra算法的差别在于,此算法能够计算边权为负值的情况.使用此算法首先须要用邻接表建图,用dis数组存放当前点距起点的最短权值之和.用mark数组标记已使用过的点.SPFA算法过程与广度优先搜索相似,此代码与BFS的差别在于已经标记的点.在再次取出来的时候要取消标记. 本题AC代码

HDOJ 3790 最短路径问题(dijkstra算法)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17968    Accepted Submission(s): 5385 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

The Postal Worker Rings Once(UVA 117)最短路径—SPFA算法+邻接表

The Postal Worker Rings Once From:UVA, 117 Time Limit: 3000 MS Background Graph algorithms form a very important part of computer science and have a lineage that goes back at least to Euler and the famous Seven Bridges of K?nigsberg problem. Many opt

hdu 3790 最短路径问题(双重权值,dijkstra算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费!!! (2)更新路径的时候要注意更新花费. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int INF=9999999; 5 int map[1010][1010],Min,n,co

HDU 3790 最短路径问题(SPFA || Dijkstra )

题目链接 题意 : 中文题不详述. 思路 :无论是SPFA还是Dijkstra都在更新最短路的那个地方直接将花费更新了就行,还有别忘了判重边,话说因为忘了判重边WA了一次. 1 //3790 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 const int INF = 1 <

HDU ACM 1535 Invitation Cards单点到多源最短路-&gt;SPFA算法

题意:有一个起始站点,从这里送n个学生去其余的n-1个站点邀请人们去CSS,然后再返回CSS,使得总的花费最小.注意每次只能送一个,返回时每次也只能送一个,而且每条路是单向的. 分析:这相当于一个有向图,我们只需两次调用SPFA算法即可,第一次求出初始站点(在这里是1)到其它所有站点的最小花费,然后相加:第二次将图反向建立,即所有的边反向,再求出初始站点(这里是1)到其它站点的最小费用,之后相加,第二步的图反向后按照第一次的求法就相当于从其它所有点到初始点的最小距离,因为算法只能求单点到多点而不

【最短路+最小费用】hdu 3790 最短路径问题

Source : hdu 3790 最短路径问题 http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是两个数 s,t;起点s,终