牛客假日团队赛54 I-Meeting Time——图的遍历

Meeting Time
题目描述

Bessie and her sister Elsie want to travel from the barn to their favorite field, such that they leave at exactly the same time from the barn, and also arrive at exactly the same time at their favorite field.
The farm is a collection of N fields (1 <= N <= 16) numbered 1…N, where field 1 contains the barn and field N is the favorite field. The farm is built on the side of a hill, with field X being higher in elevation than field Y if X < Y. An assortment of M paths connect pairs of fields. However, since each path is rather steep, it can only be followed in a downhill direction. For example, a path connecting field 5 with field 8 could be followed in the 5 -> 8 direction but not the other way, since this would be uphill. Each pair of fields is connected by at most one path, so M <= N(N-1)/2.
It might take Bessie and Elsie different amounts of time to follow a path; for example, Bessie might take 10 units of time, and Elsie 20. Moreover, Bessie and Elsie only consume time when traveling on paths between fields – since they are in a hurry, they always travel through a field in essentially zero time, never waiting around anywhere.
Please help determine the shortest amount of time Bessie and Elsie must take in order to reach their favorite field at exactly the same moment.

输入描述:

The first input line contains N and M, separated by a space.
Each of the following M lines describes a path using four integers A B
C D, where A and B (with A < B) are the fields connected by the path,
C is the time required for Bessie to follow the path, and D is the
time required for Elsie to follow the path. Both C and D are in the
range 1…1000.

输出描述:

A single integer, giving the minimum time required for Bessie and
Elsie to travel to their favorite field and arrive at the same moment.
If this is impossible, or if there is no way for Bessie or Elsie to reach
the favorite field at all, output the word IMPOSSIBLE on a single line.

示例1
输入
3 3
1 3 1 2
1 2 1 2
2 3 1 2
输出
2
说明

Bessie is twice as fast as Elsie on each path, but if Bessie takes the
path 1->2->3 and Elsie takes the path 1->3 they will arrive at the
same time.

题意:
题目描述: Bessie和她的妹妹Elsie想从粮仓去她们最喜欢的田地,也就是能够使她们一起从粮仓离开,并且能同一时间到达的田地。

这个农场是由N块(1 <= N <= 100)编号为1…N的田地构成的,第一块田地就是粮仓,并且第N块田地是她们最喜欢的田地。这个农场建在山的一边,所以,如果 X < Y 的话则满足第X块田地的高度要高于第Y块田地的高度。在这之中,有M条交错纵横的路径将不同的田地连接起来。不过,显而易见的是,因为每条路都太陡了,所以这些小路只能沿着从高到低的方向走。例如,一条连接第5块田地和第8块田地的小路只能沿着 5 -> 8 的方向走,而不能沿着其他方向,因为那样会成为上坡路。每两块田地最多只能有一条路径相连接,所以一定有 M <= N(N-1)/2。

有可能的是,Bessie和Elsie两个人走同一条小路会耗费不同的时间;比如,通过同一条小路,Bessie可能会耗费10个单位的时间,而Elsie会耗费20个单位的时间。此外,Bessie和Elsie只会在通过连接两块田地的小路时耗费时间——因为她们太匆忙了,在穿过田地时不会耗费任何时间,也从来不在任何地方停下来等待。

现在,请你判断出,能够满足使Bessie和Elsie同时出发并且同时到达她们喜欢的田地的最短的时间。

输入:
第一行输入N和M,中间用空格分开。

接下来的M行,每行有四个整型A B C D,其中,A和B(A < B)代表着两块用这条小路连接的田地,C代表Bessie通过这条小路的时间,而D代表Elsie通过这条小路的时间。C和D均在 1…100 的范围之内。

输出:
一个整型,输出的是能够使两人同时出发并且同时到达目的地的最短时间,如果没有满足条件的答案,则输"IMPOSSIBLE"。

题解: 两个人一人用一个二维数组来记录达到终点的时间。数组的第一维表示时间,第二维表示当前到达的点。数组中存放一个布尔值,代表两姊妹是否可以到达该点。如果两兄妹在同一时刻 t 到达终点,则输出 t ,否则,继续遍历,直至所有路被遍历完。详细逻辑见代码。

c++ AC 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 105, M = N * N;

int n, m, head[N];
int cnt = 1;
bool Bessie[M][N], Elsie[M][N];

struct Edge
{
	int nxt;	// 连接当前点的下一条边
	int to;		// 当前点的另一端的点的编号
	int w;		// 该边的权值
	int w2;
} edge[M];

void add(int u, int v, int w, int w2)	// 链式前向星存图(不了解的可以百度)
{
	edge[cnt].to = v;
	edge[cnt].nxt = head[u];
	edge[cnt].w = w;
	edge[cnt].w2 = w2;
	head[u] = cnt++;
}

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1, u, v, w, w2; i <= m; i++)
	{
		scanf("%d%d%d%d", &u, &v, &w, &w2);
		add(u, v, w, w2);
	}

	Bessie[0][1] = Elsie[0][1] = 1;

	for (int t = 0; t < M; t++)			// 遍历所有的路径
	{
		if (Bessie[t][n] && Elsie[t][n])	// 如果两姊妹的到达终点的时间相同,输出时间 t
		{
			printf("%d\n", t);
			system("pause");
			return 0;
		}
		for (int i = 1; i <= n; i++)	// 遍历所有的点
		{
			if (Bessie[t][i])		// 如果Bessie可达i点,围绕i点将她从i点出发可达的点都遍历了,并记录抵达这些点的时间
			{
				for (int j = head[i]; j; j = edge[j].nxt)	// 链式前向星的图的遍历的方法
					Bessie[t + edge[j].w][edge[j].to] = 1;	// t + edge[j].w 表示走过的地方花费的时间加上将要通过的路花费的时间
			}
			if (Elsie[t][i])	// 同Bessie
			{
				for (int j = head[i]; j; j = edge[j].nxt)
					Elsie[t + edge[j].w2][edge[j].to] = 1;
			}
		}
	}
	// 如果所有边都遍历完了还是无法同时抵达终点,输出“IMPOSSIBLE”
	puts("IMPOSSIBLE");
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值