Dijkstra瞎搞,感觉这个题等于两个L2-001 紧急救援。。。

明确一点,当有多条最短距离的路径时,取经过的点数最少的路径。

当有多条最短时间的路径时,取距离最短的那一条。

建议代码里面写点注释,不然容易搞死自己。

Code:

#include <bits/stdc++.h>
#define ll long long
const ll inf = 1e9 + 7;
using namespace std;
vector<int>s1, t1;
int s[505][505], t[505][505], dis[505], pre[505], cnt[505];
int n, m, a, b, c, d, e, ss, ee, ans1, ans2;
bool book[505];
void print1(int k)
{
	if (k == ss)
	{
		s1.push_back(k);
		return;
	}
	print1(pre[k]);
	s1.push_back(k);
}
void print2(int k)
{
	if (k == ss)
	{
		t1.push_back(k);
		return;
	}
	print2(pre[k]);
	t1.push_back(k);
}
int main()
{
	scanf("%d%d", &n, &m);
	fill(s[0], s[0] + 505 * 505, inf);
	fill(t[0], t[0] + 505 * 505, inf);
	while (m--)
	{
		scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
		if (c == 1)
		{
			s[a][b] = d;
			t[a][b] = e;
		}
		else
		{
			s[a][b] = d;
			s[b][a] = d;
			t[a][b] = e;
			t[b][a] = e;
		}
	}
	scanf("%d%d", &ss, &ee);
	//距离
	fill(dis, dis + 505, inf);
	dis[ss] = 0;
	for (int i = 0; i < n; i++)
	{
		int f = -1, minn = inf;
		for (int j = 0; j < n; j++)
		{
			if (book[j] == false && dis[j] < minn)
			{
				minn = dis[j];
				f = j;
			}
		}
		if (f == -1)
			break;
		book[f] = true;
		for (int j = 0; j < n; j++)
		{//cnt是时间
			if (book[j] == false && dis[j] > dis[f] + s[f][j])
			{
				dis[j] = dis[f] + s[f][j];
				cnt[j] = cnt[f] + 1;
				pre[j] = f;
			}
			else if (book[j] == false && dis[j] == dis[f] + s[f][j])
			{
				if (cnt[j] > cnt[f] + 1)
				{
					cnt[j] = cnt[f] + 1;
					pre[j] = f;
				}
			}
		}
	}
	ans1 = dis[ee];
	print1(ee);
	//时间
	memset(cnt, 0, sizeof(cnt));
	memset(book, false, sizeof(book));
	fill(dis, dis + 505, inf);
	dis[ss] = 0;
	for (int i = 0; i < n; i++)
	{
		int f = -1, minn = inf;
		for (int j = 0; j < n; j++)
		{
			if (book[j] == false && dis[j] < minn)
			{
				minn = dis[j];
				f = j;
			}
		}
		if (f == -1)
			break;
		book[f] = true;
		for (int j = 0; j < n; j++)
		{//cnt是点数
			if (book[j] == false && dis[j] > dis[f] + t[f][j])
			{
				cnt[j] = cnt[f] + s[f][j];
				dis[j] = dis[f] + t[f][j];
				pre[j] = f;
			}
			else if (book[j] == false && dis[j] == dis[f] + t[f][j])
			{
				if (cnt[j] > cnt[f] + s[f][j])
				{
					cnt[j] = cnt[f] + s[f][j];
					pre[j] = f;
				}
			}
		}
	}
	ans2 = dis[ee];
	print2(ee);
	if (s1.size() == t1.size())
	{
		for (int i = 0; i < s1.size(); i++)
			if (s1[i] != t1[i])
				goto qwe;
		printf("Time = %d; Distance = %d: ", ans2, ans1);
		for (int i = 0; i < s1.size(); i++)
		{
			printf("%d", s1[i]);
			if (i != s1.size() - 1)
				printf(" => ");
		}
		system("pause");
		return 0;
	}
qwe:;
	printf("Time = %d: ", ans2);
	for (int i = 0; i < t1.size(); i++)
	{
		printf("%d", t1[i]);
		if (i != t1.size() - 1)
			printf(" => ");
	}
	printf("\nDistance = %d: ", ans1);
	for (int i = 0; i < s1.size(); i++)
	{
		printf("%d", s1[i]);
		if (i != s1.size() - 1)
			printf(" => ");
	}
	system("pause");
}