HDU3790最短路径问题(Dijkstra算法)

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 35039    Accepted Submission(s): 10253


 

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,终点。n和m为0时输入结束。
(1

Output

输出 一行有两个数, 最短距离及其花费。

Sample Input 

3 2
1 2 5 6
2 3 4 5
1 3
0 0

Sample Output

9 11

Source

浙大计算机研究生复试上机考试-2010年

问题链接:HDU3790最短路径问题

问题分析:经典的单源最短路径问题,使用Dijkstra算法,注意当最短路径一样时,要更新花费。

程序说明:程序使用vector实现的邻接表存储图,dist数组存储源点到各个结点的最短距离,使用优先队列存储目前到各结点的最短路径。

AC的C++程序:

#include
#include
#include

using namespace std;
const int INF=((unsigned int)(-1)>>1);
const int N=1005;

struct Edge{
	int v,length,cost;//length为长度,cost为花费
	Edge(int v,int length,int cost):v(v),length(length),cost(cost){}
};

struct Node{
	int u,length;
	Node(){}
	Node(int u,int length):u(u),length(length){}
	bool operator<(const Node &a)const
	{
		return length>a.length;
	}
};

vectorg[N];
int dist[N];
int cost[N];
int vis[N];

void dijkstra(int s,int n)
{
	priority_queueq;
	for(int i=0;i<=n;i++){
		dist[i]=INF;
		cost[i]=INF;
		vis[i]=false;
	}
	dist[s]=0;
	cost[s]=0;
	q.push(Node(s,0));
	while(!q.empty()){
		Node e=q.top();
		q.pop();
		int u=e.u;
		if(!vis[u]){
			vis[u]=true;
			int num=g[u].size();
			for(int i=0;i

你可能感兴趣的:(图论__最短路径)