滴滴笔试毕业旅行——回溯法(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;
}
