分道扬镳 /// 邻接表 DFS 剪枝 oj1332
题目大意:
编号为1…N 的N个城市之间以单向路连接,每一条道路有两个参数:路的长度和通过这条路需付的费用。
Bob和Alice生活在城市1,但是当Bob发现了Alice玩扑克时欺骗他之后,他决定与她翻脸,离开城市1前往城市N。Bob想尽快到达城市N,但是他的钱不多。
希望你帮助Bob找到一条从城市1到城市N的总费用不超过Bob的承受能力的最短路径。
输入的第一行是3个整数 K, N, R ,其中:
K:表示Bob能承受的最大费用,0 ≤ K ≤ 10000
N:表示城市的总数,2 ≤ N ≤ 100
R:表示道路的条数,1 ≤ R ≤ 10000
接下来的R行,每行用S D L T(以空格隔开)表示一条道路:
S:表示道路的出发城市,1 ≤ S ≤ N
D:表示道路的目标城市,1 ≤ D ≤ N
L:表示道路的长度,1 ≤ L ≤ 100
T:表示通过这条道路需付的费用,0 ≤ T ≤ 100
为每个测试用例输出一行结果:总费用小于或等于最大费用K的最短路径的长度。如果这样的路径不存在,则仅仅输出 -1 。
5 6 7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2
11
测试数据的图中可能有重边、有自环。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std; int s[],d[],l[],t[],flag[];
int k,n,r,len,minlen[][],first[],nexti[]; void DFS(int i,int le,int fe)
{
if(fe>k || le>minlen[i][fe] || le>len) return;
/// 用minlen数组记下 i 点在 fe 花费时的最短距离,若超过则可停止继续搜索了 if(i==n)
{
len=min(len,le);
//printf("%d\n",len);
return ;
}
else
{
if(le<minlen[i][fe]) /// 若存在更短的距离 则更新minlen的值
for(int j=fe;j<=k;j++)
minlen[i][j]=le; int in=first[i];
while(in!=-)
{
if(!flag[d[in]])
{
flag[d[in]]=; /// 避免自环情况
DFS(d[in],le+l[in],fe+t[in]);
flag[d[in]]=;
}
in=nexti[in];
} /// 邻接表遍历 } }
int main()
{
while(~scanf("%d%d%d",&k,&n,&r))
{
memset(flag,,sizeof(flag));
for(int i=;i<;i++)
for(int j=;j<;j++)
minlen[i][j]=;
memset(first,-,sizeof(first)); for(int i=;i<=r;i++)
{
scanf("%d%d%d%d",&s[i],&d[i],&l[i],&t[i]);
nexti[i]=first[s[i]];
first[s[i]]=i;
} /// 建邻接表 可避免重边引起的错误 flag[]=; len=INF;
DFS(,,); if(len==INF) printf("-1\n");
else printf("%d\n",len);
} return ;
}
分道扬镳 /// 邻接表 DFS 剪枝 oj1332的更多相关文章
- zzuli 1907: 小火山的宝藏收益 邻接表+DFS
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 113 Solved: 24 SubmitStatusWeb Board Description ...
- HDU2586 How far away ? 邻接表+DFS
题目大意:n个房子,m次询问.接下来给出n-1行数据,每行数据有u,v,w三个数,代表u到v的距离为w(双向),值得注意的是所修建的道路不会经过一座房子超过一次.m次询问,每次询问给出u,v求u,v之 ...
- 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...
- 魔法宝石(邻接表+dfs更新)
魔法宝石 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submissi ...
- 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 ...
- PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)
//采用不同的图存储结构结构邻接矩阵.邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替......怕了并查集了 //邻接矩阵dfs #include< ...
- 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))
sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个有向图 ...
- zstu.4191: 无向图找环(dfs树 + 邻接表)
4191: 无向图找环 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 117 Solved: 34 Description 给你一副无向图,每条边有 ...
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...
随机推荐
- php开发面试题---2、php常用面试题二(表单提交方式中的get和post有什么区别)
php开发面试题---2.php常用面试题二(表单提交方式中的get和post有什么区别) 一.总结 一句话总结: 数据位置:get参数在url里面,post在主体里面 数据大小:get几kb,pos ...
- SpringBoot中配置不序列化返回值为null的属性
package com.weiresearch.properties; import com.fasterxml.jackson.annotation.JsonInclude;import com.f ...
- (3)Redis conifg
redis.windows-service.conf Redis-x64-3.2.100 # Redis configuration file example # Note on units ...
- 文本表征:SoW、BoW、TF-IDF、Hash Trick、doc2vec、DBoW、DM
原文地址:https://www.jianshu.com/p/2f2d5d5e03f8 一.文本特征 (一)基本文本特征提取 词语数量 常,负面情绪评论含有的词语数量比正面情绪评论更多. 字符数量 常 ...
- leetcode.字符串.409最长回文串-Java
1. 具体题目 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串.在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设 ...
- nth_element函数
使用方法:nth_element(start, start+n, end) 使第n大元素处于第n位置(从0开始,其位置是下标为n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都 ...
- ArcGis Python常用脚本
ArcGis Python脚本——ArcGIS 中使用的 Python 是什么版本 ArcGis Python脚本——批量添加字段 ArcGis Python脚本——批量删除字段 ArcGis Pyt ...
- docker学习---搭建Docker LAMP环境
1.环境 系统版本:CentOS Linux release 7.4.1708 docker版本:docker-ce-18.09 主机IP:192.168.121.121 2.载入MySQL和PHP镜 ...
- 在VSCode中使用Markdown
前言 最近在学习使用Markdown语法,尝试使用了"MarkdownEditor"."Sublime Text3"."VSCode"这三种 ...
- selenium 操作键盘事件
一.key包提供按键方法 使用必须先引用key包:from selenium.webdriver.common.keys import Keys 键盘事件,在现实操作中我们习惯性的按tab见切换到写一 ...