题目链接:http://poj.org/problem?id=1724

题目意思:给出一个含有N个点(编号从1~N)、R条边的有向图。Bob 有 K 那么多的金钱,需要找一条从顶点1到顶点N的路径(每条边需要一定的花费),前提是这个总花费  <= K.

首先这里很感谢 yunyouxi0 ,也就是我们的ACM队长啦~~~,他一下子指出了我的错误——存储重边的错误。这条题卑鄙的地方是,有重边,discuss 中的数据过了也不一定会AC啦。大家不妨试试这组数据(队长深情奉献^_^)

2

2

2

1  2   2   3

1  2   3   2

ans:   3

用邻接表来存储就可以解决这个问题啦。看了差不多整天的邻接表,终于看懂了,大感动啊^__^。对于初次使用的我(或者其他也是第一次接触的读者),希望这幅图能帮大家理解理解~~~~

我用Sample 来解释这幅图

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

建立一个邻接表

struct adj_table // 邻接表
{
int next, D, L, T;
}node[M];

首先这个F[i] 表示对于编号为 i 这个 点中跟它相邻的点有多少个,也就是表头!

那些0、3、1、...、5的意思实质就是第几行输入,假设是3 5 2 0, 是图中的数字 5了,对于3这个点来说,如果还有一条从点3出发的边,那么下一次插入就从这个 5 开始。

可能我还是说得不清不楚啦~~~,结合这个运行结果还有上面那幅本人呕心沥血图来看,是不是一下子豁然开朗呢?注意 j = 3(v = 3) 之后,下一个点是node[3].next ,也就是 0(v = 2),由于我们在插入的时候,node[3].D 已经把目标节点记录下来了,还有长度和花费,所以不断往返的时候,就能求出所有跟 j = 3 的所有相邻节点了(再下一个是 node[0].next ,为-1 就停止了,代表已经到达头结点:编号为1的点,刚好对于节点1来说,  2, 3 就是跟它邻接的点,由于是回溯回去的,所以先输出3, 再输出2)

(first 点 6 结束了,因为从6出发没有路!)

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int INF = ;
const int M = + ;
const int maxn = + ;
struct adj_table // 邻接表
{
int next, D, L, T;
}node[M]; // 不要开小了!!!写成maxn会runtime error int F[maxn]; // 表头
int vis[maxn]; int K, N, R, flag, minlen; void dfs(int head, int r, int l)
{
if (l > minlen) // 剪枝,防止TLE的关键
return;
if (head == N && r >= )
{
flag = ;
minlen = min(minlen, l);
return;
}
for (int i = F[head]; i != -; i = node[i].next)
{
int v = node[i].D;
if (!vis[v]&& r-node[i].T >= ) // 未走过+费用足
{
vis[v] = ;
dfs(v, r-node[i].T, l+node[i].L); // 注意:不是r-node[v].T和l+node[v].L, 因为是指向下一个顶点, v是当前顶点
vis[v] = ;
}
}
} int main()
{
while (scanf("%d%d%d", &K, &N, &R) != EOF)
{
int s, d, l, t;
int count = ;
memset(vis, , sizeof(vis));
memset(F, -, sizeof(F));
for (int i = ; i < R; i++)
{
scanf("%d%d%d%d", &s, &d, &l, &t);
node[count].next = F[s];
node[count].D = d, node[count].L = l, node[count].T = t;
F[s] = count++;
}
vis[] = ;
minlen = INF, flag = ;
dfs(, K, );
printf("%d\n", !flag ? - : minlen);
}
return ;
}

poj 1724 ROADS 解题报告的更多相关文章

  1. 深搜+剪枝 POJ 1724 ROADS

    POJ 1724 ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12766   Accepted: 4722 D ...

  2. POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)

    经典好题. 题意是要我们找出所有的正方形.1000点,只有枚举咯. 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标.反之,遍历所有点作为A,B点,看C,D点是否存在.存在的话正方 ...

  3. poj 2421 Constructing Roads 解题报告

    题目链接:http://poj.org/problem?id=2421 实际上又是考最小生成树的内容,也是用到kruskal算法.但稍稍有点不同的是,给出一些已连接的边,要在这些边存在的情况下,拓展出 ...

  4. 【原创】poj ----- 1182 食物链 解题报告

    题目地址: http://poj.org/problem?id=1182 题目内容: 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  5. POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-1724 N cities named with numbers 1 ... N are connected with ...

  6. poj 1724 ROADS 很水的dfs

    题意:给你N个城市和M条路和K块钱,每条路有话费,问你从1走到N的在K块钱内所能走的最短距离是多少 链接:http://poj.org/problem?id=1724 直接dfs搜一遍就是 代码: # ...

  7. poj 2051.Argus 解题报告

    题目链接:http://poj.org/problem?id=2051 题目意思:题目有点难理解,所以结合这幅图来说吧---- 有一个叫Argus的系统,该系统支持一个 Register 命令,输入就 ...

  8. poj 1102.LC-Display 解题报告

    题目链接:http://poj.org/problem?id=1102 题目意思:就是根据给出的格式 s 和 数字 n,输出数值 n 的 LCD 显示.数值 n 的每个数字要占据 s + 2 列 和 ...

  9. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

随机推荐

  1. 洛谷 P1756 最小花费

    题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元 ...

  2. 降雨量 BZOJ 1067

    降雨量 [问题描述] 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,20 ...

  3. NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]

    我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS   ...

  4. 【hibernate/JPA】注解方式实现 复合主键【spring boot】

    1>hibernate/JPA实现复合主键的思路:是将所有的主键属性封装在一个主键类中,提供给需要复合主键的实体类使用. 2>主键类的几点要求: . 使用复合主键的实体类必须实现Seria ...

  5. Delphi 的内存操作函数(1): 给字符指针分配内存

    马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr ...

  6. android studio 使用(一)

    官方网址入门:https://developer.android.com/studio/install.html 看下Build Your first App,

  7. Android 使用ListView的A-Z字母排序功能实现联系人模块

    在上一篇文章其中,主要学习了ListView的A-Z字母排序功能以及依据输入框的输入值改变来过滤搜索结果,假设输入框里面的值为空.更新为原来的列表,否则为过滤数据列表,包含汉字转成拼音的功能.假设你还 ...

  8. weex 项目开发(三) weexpack + weex-ui

    github地址:weex-ui https://github.com/alibaba/weex-ui 官网: https://alibaba.github.io/weex-ui/#/cn/ 创建项目 ...

  9. LInux查看CPU状态

    1.htop 2.top 内容解释: PID:进程的ID USER:进程所有者 PR:进程的优先级别,越小越优先被执行 NInice:值 VIRT:进程占用的虚拟内存 RES:进程占用的物理内存 SH ...

  10. centos Linux 常用命令汇总

    CentOS 关闭防火墙 1) 永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后复原 开启: ...