#HDU 3790 最短路径问题 Dijkstra入门题

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#HDU 3790 最短路径问题 Dijkstra入门题相关的知识,希望对你有一定的参考价值。

题目:

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19767????Accepted Submission(s): 5880


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<n<=1000, 0<m<100000, s != t)

?

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

Sample Input
3 2 1 2 5 6 2 3 4 5 1 3 0 0
?

Sample Output
9 11
?

Source
php?

field=problem&key=%D5%E3%B4%F3%BC%C6%CB%E3%BB%FA%D1%D0%BE%BF%C9%FA%B8%B4%CA%D4%C9%CF%BB%FA%BF%BC%CA%D4-2010%C4%EA&source=1&searchmode=source" style="color:rgb(26,92,200);text-decoration:none;">浙大计算机研究生复试上机考试-2010年



题目简单;


标准Dijkstra,注意在更新距离值时同一时候更新价格。最后一并输出。


数据没有坑点。


#include<iostream>
#include<algorithm>
#include<queue>
#include<string.h>
#include<math.h>
#include<vector>

using namespace std;

struct node{
	int ans = 0;
	int vis = 0;
	int minr = 1e9;
	vector<int>con;
	vector<int>len;
	vector<int>exp;
}data[2005];

int main()
{
	int n, m, begi, endi;
	while (cin >> n >> m)
	{
		if (n == 0 && m == 0)
		{
			return 0;
		}
		for (size_t i = 0; i <= n; i++)
		{
			data[i].ans = 0;
			data[i].vis = 0;
			data[i].minr = 1e9;
			data[i].con.clear();
			data[i].len.clear();
			data[i].exp.clear();
		}
		for (size_t i = 0; i < m; i++)
		{
			int be, ed, len, tar;
			scanf("%d%d%d%d", &be, &ed, &len, &tar);
			data[be].con.push_back(ed);
			data[be].len.push_back(len);
			data[ed].con.push_back(be);
			data[ed].len.push_back(len);
			data[be].exp.push_back(tar);
			data[ed].exp.push_back(tar);
		}
		cin >> begi >> endi;
		data[begi].ans = 0;
		data[begi].minr = 0;
		while (1)
		{
			if (begi == endi)
			{
				break;
			}
			int size = data[begi].con.size();
			for (size_t i = 0; i < size; i++)
			{
				if (data[data[begi].con[i]].minr > data[begi].minr + data[begi].len[i])
				{
					data[data[begi].con[i]].ans = data[begi].ans + data[begi].exp[i];
					data[data[begi].con[i]].minr = data[begi].minr + data[begi].len[i];
				}
				else if (data[data[begi].con[i]].minr == data[begi].minr + data[begi].len[i])
				{
					data[data[begi].con[i]].ans = min(data[begi].ans + data[begi].exp[i], data[data[begi].con[i]].ans);
				}
			}
			data[begi].vis = 1;
			int temp = 1e9;
			begi = -1;
			for (size_t i = 1; i <= n; i++)
			{
				if (temp>data[i].minr&&data[i].vis == 0)
				{
					temp = data[i].minr;
					begi = i;
				}
			}
			if (begi == -1)
			{
				break;
			}
		}
		cout << data[endi].minr << " " << data[endi].ans << "\n";
	}

}


以上是关于#HDU 3790 最短路径问题 Dijkstra入门题的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 3790 最短路径问题(Dijkstra+优先队列优化)

HDU 3790 最短路径问题 (最短路)

HDU 3790 最短路径问题(Dijkstra 迪杰斯特法最短路径算法)

HDU - 3790最短路径问题(DIjkstra算法 双权值)

C - 最短路径问题 (HDU - 3790 )

dijkstra算法模板_HDU3790