题目: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. 使用Guava的RateLimiter完成简单的大流量限流

    限流的一般思路: 1.随机丢弃一定规则的用户(迅速过滤掉90%的用户): 2.MQ削峰(比如设一个MQ可以容纳的最大消息量,达到这个量后MQ给予reject): 3.业务逻辑层使用RateLimite ...

  2. 内核中的锁机制--RCU

    一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了 ...

  3. Java驱动远程连接mongoDB(简明易懂版)

    mongodb默认是不能远程连接的,而且在linux安装完你会发现,它的目录极其简单,连个配置文件都没有. 我的mongodb的版本是3.6,目前最新的.https://www.mongodb.com ...

  4. Python的虚拟机安装已经如何配置Scrapy for Mac

    时间:2018年2月21日 因为时间问题,以下笔记就粗略记录.仅作为个人笔记为用 安装virtualenv和virtualenvwrapper 如何安装的细节下面这篇也有介绍,包括如何使用切换虚拟机也 ...

  5. Android内存泄漏杂谈

    内存泄漏:是指内存得不到GC的及时回收,从而造成内存占用过多.从而导致程序Crash,也就是常说的OOM. 一.static 先来看以下一段代码 public class DBHelper { pri ...

  6. 物联网架构成长之路(26)-Docker构建项目用到的镜像2

    0. 前言 前面介绍的都是一些标准的第三方中间件,基本都是有现成的Dockerfile或者Image,不需要我过多的关心,这一篇要介绍一些自己构建的Docker Image了.刚开始学,Dockerf ...

  7. xz -d Python-3.4.7.tar.xz

    xz -d Python-3.4.7.tar.xz------>Python-3.4.7.tar tar -xvf Python-3.4.7.tar

  8. C语言 · 出栈次序

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

  9. fastDFS 命令笔记

    端口开放 这是命令运行的前提 iptables -I INPUT -p tcp -m state –state NEW -m tcp –dport 22 -j ACCEPT iptables -I I ...

  10. 基于μC/OS—III的CC1120驱动程序设计

    基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120   嵌入式操作系统   STM32F103ZE   ...