滴滴笔试毕业旅行——回溯法(dfs)

题目:

题目描述:
小滴正在筹划他的毕业旅行。他打算去找他的外国网友们,首先第一站是法国巴黎,但是去巴黎的路线有很多,交通工具也有很多可供选择。

现在有一个结点数为n,边的条数为m的无向图表示小滴到巴黎的所有路线。其中小滴的家为结点s,巴黎为结点e,小滴出发时间为start,请问小滴最早什么时候能到达巴黎?



输入描述
单组输入,数字间有空格隔开。

第一行两个整数:结点数n,边数m(n<=1000,m<=10000)。

第二行到第m+1行每行各有三个整数:结点u,结点v,需要的时间time(1<=u,v<=n,time<50,time以小时为单位)。

最后一行为家的位置:s,巴黎的位置:e,出发时间start(1<=s,e<=n,出发时间格式为month.day/hour,小时为24小时制,出发年份默认为2020年,且一定会在2020年到达,数据保证有解。)

输出描述
最早能到达巴黎的时间e time(格式与出发时间格式相同)。


样例输入
4 4
1 2 5
1 3 6
2 4 8
3 4 6
1 4 7.9/8
样例输出
7.9/20

提示
输入样例2
4 4
1 2 25
1 3 18
2 4 28
3 4 22
1 4 7.9/8

输出样例2
7.11/0

c++代码实现: 这里只求了最短时间,还没有换算成月/日/时的格式:

//回溯法-深度优先遍历
#include<iostream>
#include<vector>
#include<string>

using namespace std;


int dfs(vector<vector<int>>inputs, int i, int end, int count, int m, vector<bool>& visited)
{
          
   
	visited[i] = true;
	if (inputs[i][1] == end)
	{
          
   
		count += inputs[i][2];
		return count;
	}
	int min_count = 9999;
	int temp = count;
	for (int j = 0; j < m; j++)
	{
          
   
		if (inputs[j][0] == inputs[i][1] && visited[j] == false)
		{
          
   
			count += inputs[i][2];
			count =  dfs(inputs, j, end, count, m, visited);//重点
			min_count = min_count > count ? count : min_count;//重点
			visited[j] = false;
		}
		count = temp;//重点,注意把循环之前的count保留下来
	}
	return min_count;
}

int main()
{
          
   
	int n, m;
	cin >> n >> m;
	vector<vector<int>>inputs(m, vector<int>(3, 0));
	for (int i = 0; i < m; i++)
	{
          
   
		for (int j = 0; j < 3; j++)
		{
          
   
			cin >> inputs[i][j];
		}
	}
	int start;
	int end;
	string time;
	int min_count = 999999;
	cin >> start >> end >> time;
	vector<bool>visited(m, false);
	for (int i = 0; i < m; i++)
	{
          
   
		int count = 0;
		if (inputs[i][0] == start)
		{
          
   
			for (int i = 0; i < m; i++)
			{
          
   
				visited[i] = false;
			}
			count = dfs(inputs, i, end, count, m, visited);
			min_count = min_count < count ? min_count : count;
		}
	}
	cout << min_count << endl;
	return 0;
}
经验分享 程序员 微信小程序 职场和发展