PAT1111 Online Map【最短路】【dfs】
题目: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】的更多相关文章
- 题目1539:师弟 ——最短路+DFS
题意::从起点到终点的所有的最短路中,找出离终点有X个路口的城市一共有几个 开始我用最短路+DFS从起点开始搜,超时了 换了一种方法,从终点开始搜,AC #include<stdio.h> ...
- PAT-1111 Online Map (30分) 最短路+dfs
明天就要考PAT,为了应付期末已经好久没有刷题了啊啊啊啊,今天开了一道最短路,状态不是很好 1.没有读清题目要求,或者说没有读完题目,明天一定要注意 2.vis初始化的时候从1初始化到n,应该从0开始 ...
- 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 ...
- 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 ...
- HDU_1142(最短路 + dfs)
Jimmy experiences a lot of stress at work these days, especially since his accident made working dif ...
- Let‘s play computer game(最短路 + dfs找出所有确定长度的最短路)
Let's play computer game Description xxxxxxxxx在疫情期间迷上了一款游戏,这个游戏一共有nnn个地点(编号为1--n1--n1--n),他每次从一个地点移动 ...
- 哈理工 oj 2122 旅行(map + 最短路dij算法)
旅行 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 18(6 users) Total Accepted: 3(3 users) Ra ...
- cf1051F. The Shortest Statement(最短路/dfs树)
You are given a weighed undirected connected graph, consisting of nn vertices and mm edges. You shou ...
- PAT1018——最短路加DFS
http://pat.zju.edu.cn/contests/pat-a-practise/1018 在杭州各个点,有很多自助自行车的点,最大容纳点为CMAX,但比较适合的情况是CMAX/2, 现在从 ...
随机推荐
- mysql字符串用法
replace(str,from_str,to_str) --用字符串to_str替换字符串str中的子串from_str并返回 --mysql> select replace('www.mys ...
- datagrip离线安装驱动jar
问题描述: datagrip离线安装驱动,在线的安装驱动一般默认安装在当前用户下.DataGrip xxxx 问题解决: 在线在线下载驱动jar,复制jar到内网离线环境 01.外网已经存在的jar提 ...
- webstorm激活方法webstorm注册码 jetbrains激活
安装完成后,打开 WebStorm, 在打开的 License Activation 窗口中选择 License server. 在输入框输入网址即可: http://idea.codebeta.cn ...
- numpy累积
numpy累积有两类函数:np.cumxxxxx和np.ufunc.accumulate() import numpy as np a = np.arange(1, 5) print(np.cumpr ...
- 深入理解Java String类(综合)
在Java语言了中,所有类似“ABC”的字面值,都是String类的实例:String类位于java.lang包下,是Java语言的核心类,提供了字符串的比较.查找.截取.大小写转换等操作:Java语 ...
- 【WCF】解析WCF服务的搭建
WCF是.NET提供的一种服务,可以将自己写的程序(完成特定功能,比如从数据库中读取数据操作等)分装成服务以后,发布到服务器上.然后会生成一个网址,客户端在编程的时候,可以引用这个服务,使用这个服务中 ...
- Linux报swap空间占用过高,但物理内存还有空余
收到报警,swap空间占用过高,登录到系统查看内存使用详情,看到物理内存还有很多未使用 问题分析 Swap配置对性能的影响分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误.如 ...
- Ubuntu18.04提示wifi无法连接
[时间:2018-07] [状态:Open] [关键词:Ubuntu 18.04,wifi,apt-get,mount] 0 现象描述及背景 最近需要一个Ubuntu的系统作为开发环境,随机下载了v1 ...
- QtCreator pro中相对路径和debug文件夹下未放动态库时调试报QtCreator:during startup program exited with code 0xc0000135错误
QtCreator pro中相对路径一般是以pro文件(非main函数所在文件)所在的当前目录为起点,用$$PWD表示. 如头文件和库文件 INCLUDEPATH +=$$PWD/inc win32 ...
- Gephi 网络图可视化工具
官网: https://gephi.org/ 背景: Gephi 是一款开源,免费, 跨平台的的graph 和 network 可视化工具,同时也提供了数据挖掘 ...