题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805358663417856

题意:

给定一个图,每天边上有时间和路程信息。要求找到路程最短且时间最短的路径,和时间最短经过的节点最少的路径。

思路:

和昨天写的那个Public Bike Arrangement差不多思路。但是因为要求两个东西所以麻烦一点。感觉好像PAT也在逐渐变难。

都是先求出最短路路径,然后在这些路径中再找到符合条件的一条。

该开始直接写dfs,最后一组数据T了。

先dijkstra再dfs的话是在最短路径上找,会减很多枝。

 //#include<bits/stdc++>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#include<queue>
#include<map>
#include<stack>
#include<set> #define LL long long
#define ull unsigned long long
#define inf 0x7f7f7f7f using namespace std; const int maxn = ;
int n, m;
int st, ed;
struct node{
int v;
int l, t;
node(){}
node(int _v, int _l, int _t){
v = _v;
l = _l;
t = _t;
}
};
vector<node>g[maxn]; bool vis_l[maxn], vis_t[maxn];
int d_len[maxn], d_time[maxn];
void dijkstra()
{
memset(d_len, 0x3f, sizeof(d_len));
memset(d_time, 0x3f, sizeof(d_time));
for(int i = ; i < g[st].size(); i++){
int to = g[st][i].v;
d_len[to] = g[st][i].l;
d_time[to] = g[st][i].t;
}
vis_l[st] = true;
vis_t[st] = true;
d_len[st] = ;
d_time[st] = ; for(int i = ; i < n; i++){
int id_l, id_t;
int minl = inf, mint = inf;
for(int i = ; i < n; i++){
if(!vis_l[i] && minl > d_len[i]){
minl = d_len[i];
id_l = i;
}
if(!vis_t[i] && mint > d_time[i]){
mint = d_time[i];
id_t = i;
}
} vis_l[id_l] = true;
vis_t[id_t] = true;
for(int i = ; i < g[id_l].size(); i++){
int to = g[id_l][i].v;
if(d_len[to] > d_len[id_l] + g[id_l][i].l){
d_len[to] = d_len[id_l] + g[id_l][i].l;
}
}
for(int i = ; i < g[id_t].size(); i++){
int to = g[id_t][i].v;
if(d_time[to] > d_time[id_t] + g[id_t][i].t){
d_time[to] = d_time[id_t] + g[id_t][i].t;
}
}
}
} int ans_len = inf, time_for_minlen = inf;
int length, ttime;
vector<int>minlen, path;
bool vis[maxn];
void dfs_len(int pos)
{
if(pos == ed){
if(ttime < time_for_minlen){
time_for_minlen = ttime;
minlen = path;
return;
}
}
for(int i = ; i < g[pos].size(); i++){
int to = g[pos][i].v;
if(!vis[to] && d_len[to] == d_len[pos] + g[pos][i].l){
int tmptime = ttime;
vis[to] = true;
path.push_back(to);
ttime += g[pos][i].t;
dfs_len(to);
path.pop_back();
ttime = tmptime;
vis[to] = false;
}
} } //void dfs_len(int pos)
//{
// if(length > ans_len)return;
// if(pos == ed){
// if(length < ans_len || length == ans_len && ttime < time_for_minlen){
// ans_len = length;
// time_for_minlen = ttime;
// minlen = path;
//// if(length == ans_len)len_ununique = true;
//// else len_ununique = false;
// return;
// }
// }
// for(int i = 0; i < g[pos].size(); i++){
// int to = g[pos][i].v, l = g[pos][i].l, t = g[pos][i].t;
// if(!vis[to]){
// vis[to] = true;
// int tmplen = length, tmptime = ttime;
// length += l;
// ttime += t;
// path.push_back(to);
// dfs_len(to);
// length = tmplen;
// ttime = tmptime;
// path.pop_back();
// vis[to] = false;
// }
// }
//} int ans_time = inf, num_for_mintime = inf;
int ttt, num;
//bool ti_ununique = false;
vector<int>mintime;
void dfs_time(int pos)
{
if(pos == ed){
if(num < num_for_mintime){
num_for_mintime = num;
mintime = path;
return;
}
}
for(int i = ; i < g[pos].size(); i++){
int to = g[pos][i].v;
if(!vis[to] && d_time[to] == d_time[pos] + g[pos][i].t){
vis[to] = true;
num++;
path.push_back(to);
dfs_time(to);
num--;
vis[to] = false;
path.pop_back();
}
}
}
//void dfs_time(int pos)
//{
// if(ttt > ans_time)return;
// if(pos == ed){
// if(ttt < ans_time || ttt == ans_time && num < num_for_mintime){
// ans_time = ttt;
// num_for_mintime = num;
// mintime = path;
//// if(ttt == ans_time)ti_ununique = true;
//// else ti_ununique = false;
// return;
// }
// }
// for(int i = 0; i < g[pos].size(); i++){
// int to = g[pos][i].v, t = g[pos][i].t;
// if(!vis[to]){
// vis[to] = true;
// num++;
// int tmptime = ttt;
// ttt += t;
// path.push_back(to);
// dfs_time(to);
// num--;
// path.pop_back();
// ttt = tmptime;
// vis[to] = false;
// }
// }
//} int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i < m; i++){
int u, v;
int one_way;
int len, ti;
scanf("%d%d%d%d%d", &u, &v, &one_way, &len, &ti);
g[u].push_back(node(v, len, ti));
if(!one_way){
g[v].push_back(node(u, len, ti));
}
}
scanf("%d%d", &st, &ed); // memset(vis, 0, sizeof(vis));
// vis[st] = true;
// dfs_len(st);
// memset(vis, 0, sizeof(vis));
// vis[st] = true;
// path.clear();
// dfs_time(st); dijkstra();
memset(vis, , sizeof(vis));
dfs_len(st);
memset(vis, , sizeof(vis));
path.clear();
dfs_time(st);
ans_len = d_len[ed];
ans_time = d_time[ed]; if(mintime != minlen){
printf("Distance = %d: %d", ans_len, st);
for(int i = ; i < minlen.size(); i++){
printf(" -> %d", minlen[i]);
}
printf("\n");
printf("Time = %d: %d", ans_time, st);
for(int i = ; i < mintime.size(); i++){
printf(" -> %d", mintime[i]);
}
printf("\n");
}
else{
printf("Distance = %d; Time = %d: %d", ans_len, ans_time, st);
for(int i = ; i < minlen.size(); i++){
printf(" -> %d", minlen[i]);
}
printf("\n");
} return ;
}

PAT1111 Online Map【最短路】【dfs】的更多相关文章

  1. 题目1539:师弟 ——最短路+DFS

    题意::从起点到终点的所有的最短路中,找出离终点有X个路口的城市一共有几个 开始我用最短路+DFS从起点开始搜,超时了 换了一种方法,从终点开始搜,AC #include<stdio.h> ...

  2. PAT-1111 Online Map (30分) 最短路+dfs

    明天就要考PAT,为了应付期末已经好久没有刷题了啊啊啊啊,今天开了一道最短路,状态不是很好 1.没有读清题目要求,或者说没有读完题目,明天一定要注意 2.vis初始化的时候从1初始化到n,应该从0开始 ...

  3. HDU 1142 A Walk Through the Forest(最短路+dfs搜索)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  4. Head of a Gang (map+邻接表+DFS)

    One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...

  5. HDU_1142(最短路 + dfs)

    Jimmy experiences a lot of stress at work these days, especially since his accident made working dif ...

  6. Let‘s play computer game(最短路 + dfs找出所有确定长度的最短路)

    Let's play computer game Description xxxxxxxxx在疫情期间迷上了一款游戏,这个游戏一共有nnn个地点(编号为1--n1--n1--n),他每次从一个地点移动 ...

  7. 哈理工 oj 2122 旅行(map + 最短路dij算法)

    旅行 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 18(6 users) Total Accepted: 3(3 users) Ra ...

  8. cf1051F. The Shortest Statement(最短路/dfs树)

    You are given a weighed undirected connected graph, consisting of nn vertices and mm edges. You shou ...

  9. PAT1018——最短路加DFS

    http://pat.zju.edu.cn/contests/pat-a-practise/1018 在杭州各个点,有很多自助自行车的点,最大容纳点为CMAX,但比较适合的情况是CMAX/2, 现在从 ...

随机推荐

  1. ionic生成全尺寸icon和splash

    http://www.jianshu.com/p/eda363eb28d3 重新添加platform --no-resources可以禁止重新生成icon和splash ionic cordova p ...

  2. 一步步教你轻松学关联规则Apriori算法

    一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...

  3. error running git

    I ran xcode-select --install and everything worked for me.

  4. Jexus 5.4.6 on CentOS 6.6

    Mono 通过脚本安装 https://github.com/cjy37/linux-asp.net-installScript 版本 3.10 MongoDB 也可通过以上脚本安装 默认端口 270 ...

  5. DMA(直接存储器存取)

    DMA(Direct Memory Access) DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制. 工作原理 DMA是指外部设备不通过CPU而直接与系统 ...

  6. Windows上使用Vagrant打造Laravel Homestead可协同跨平台开发环境

    1.简介 Laravel 致力于让整个 PHP 开发过程变得让人愉悦,包括本地开发环境,为此官方为我们提供了一整套本地开发环境 —— Laravel Homestead. Laravel Homest ...

  7. python模块import具体用法

    同级目录 import 文件名 form 文件名 import * 子目录 import 目录名.文件名 form 目录名.文件名 import * 不同目录 先导入sys包,然后把对应的目录加入pa ...

  8. 【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步

    一.实验说明: 信号量是一个多任务内核提出的一个协议机构,上一个实验中我们介绍了信号量访问共享资源 的功能,其实信号量最初是用来控制访问共享资源的,它还可以用来同步一个中断服务函数和一个任 务,或者同 ...

  9. C语言 · 出栈次序

    标题:出栈次序 X星球特别讲究秩序,所有道路都是单行线.一个甲壳虫车队,共16辆车,按照编号先后发车, 夹在其它车流中,缓缓前行. 路边有个死胡同,只能容一辆车通过,是临时的检查站,如图[p1.png ...

  10. SparkStreaming基本架构及使用

    1.简介 Spark Streaming处理的数据流图: Spark Streaming在内部的处理机制是,接收实时流的数据,并根据一定的时间间隔拆分成一批批的数据,然后通过Spark Engine处 ...