1111. Online Map (30)

#include <iostream>
#include <vector>
#include <string.h>

using namespace std;

struct node
{
	int next, length, time;
};

void print(vector<int> v)
{
	int size = v.size(), i;
	for(i = 0; i < size; i++)
	{
		if(i > 0)
		{
			printf(" -> ");
		}

		printf("%d", v[i]);
	}

	printf("\n");
}

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);

	int i, flag, v1, v2;
	vector<node> v[510];
	node nod;

	for(i = 1; i <= m; i++)
	{
		scanf("%d%d%d%d%d", &v1, &v2, &flag, &nod.length, &nod.time);

		nod.next = v2;
		v[v1].push_back(nod);

		if(flag == 0)
		{
			nod.next = v1;
			v[v2].push_back(nod);
		}
	}

	int begin, end;
	scanf("%d%d", &begin, &end);

	int mark[510], length[510], time[510];
	memset(mark, 0, sizeof(mark));
	memset(length, -1, sizeof(length));
	memset(time, -1, sizeof(time));

	vector<int> path1[510];
	int p = begin;

	path1[p].push_back(p);
	mark[p] = 1;
	length[p] = 0;
	time[p] = 0;

	int size, j, next, nextlength, nexttime, min;
	for(i = 1; i < n; i++)
	{
		size = v[p].size();
		for(j = 0; j < size; j++)
		{
			next = v[p][j].next;
			if(mark[next] == 1)
			{
				continue;
			}

			nextlength = length[p] + v[p][j].length;
			nexttime = time[p] + v[p][j].time;

			if(length[next] == -1 || length[next] > nextlength || (length[next] == nextlength && (time[next] == -1 || time[next] > nexttime)))
			{
				length[next] = nextlength;
				time[next] = nexttime;

				path1[next] = path1[p];
				path1[next].push_back(next);
			}
		}

		min = 100000000;
		for(j = 0; j < n; j++)
		{
			if(length[j] == -1 || mark[j] == 1)
			{
				continue;
			}

			if(length[j] < min)
			{
				min = length[j];
				p = j;
			}
		}

		if(p == end)
		{
			break;
		}
		mark[p] = 1;
	}

	int intersections[510];
	vector<int> path2[510];

	memset(mark, 0, sizeof(mark));
	memset(time, -1, sizeof(time));
	memset(intersections, -1, sizeof(intersections));
	
	p = begin;
	mark[p] = 1;
	time[p] = 0;
	intersections[p] = 0;
	path2[p].push_back(p);

	int nextintersections;
	for(i = 1; i < n; i++)
	{
		size = v[p].size();
		for(j = 0; j < size; j++)
		{
			next = v[p][j].next;
			if(mark[next] == 1)
			{
				continue;
			}

			nexttime = time[p] + v[p][j].time;
			nextintersections = intersections[p] + 1;

			if(time[next] == -1 || time[next] > nexttime || (time[next] == nexttime && (intersections[next] == -1 || intersections[next] > nextintersections)))
			{
				time[next] = nexttime;
				intersections[next] = nextintersections;

				path2[next] = path2[p];
				path2[next].push_back(next);
			}
		}

		min = 100000000;
		for(j = 0; j < n; j++)
		{
			if(time[j] == -1 || mark[j] == 1)
			{
				continue;
			}

			if(time[j] < min)
			{
				min = time[j];
				p = j;
			}
		}

		if(p == end)
		{
			break;
		}
		mark[p] = 1;
	}

	if(path1[end] == path2[end])
	{
		printf("Distance = %d; Time = %d: ", length[end], time[end]);
		print(path1[end]);
	}
	else
	{
		printf("Distance = %d: ", length[end]);
		print(path1[end]);

		printf("Time = %d: ", time[end]);
		print(path2[end]);
	}

	system("pause");
	return 0;
}

 

posted on 2025-11-25 09:07  王景迁  阅读(0)  评论(0)    收藏  举报

导航