#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


题目简单;


标准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 << "
";
	}

}


【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/llguanli/p/8485802.html