IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> dfs+剪枝 -> 正文阅读

[数据结构与算法]dfs+剪枝

1.木棒

2. roads

题意:
N 个以数字 1 … N 命名的城市与单向道路相连。每条道路都有两个与之相关的参数:道路长度和道路需要支付的通行费。鲍勃和爱丽丝曾经住在城市 1。在注意到爱丽丝在他们喜欢玩的纸牌游戏中作弊后,鲍勃与她分手并决定搬走 到城市 N。他想尽快到达那里可能,但他缺钱。我们想帮助 Bob 找到他可以用他有的钱买得起的从城市 1 到城市 N 的最短路径。
输入的第一行包含整数 K,0 <= K <= 10000,Bob 在路上可以花费的最大硬币数。
第二行包含整数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 注意不同的道路可能有相同的来源城市和目的地城市。
输出的第一行也是唯一一行应该包含从城市 1 到城市 N 的最短路径的总长度,其总通行费小于或等于 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<iostream>
#include<vector>
#include<cstring>
using namespace std;

int k,n,r;
struct road
{
    int d,l,t;
};
vector<road> v[110];

int minlen=1<<30;
int totallen,totalcost;
int st[110];
int minl[110][10010];//表示走到i点是,花费为j的最短路径

void dfs(int s)
{
    if(s==n)
    {
        minlen=min(minlen,totallen);
        return;
    }
    for(int i=0;i<v[s].size();i++)
    {
        int d=v[s][i].d;
        if(!st[d])
        {
            if(totalcost+v[s][i].t>k) continue;//可行性剪枝
            if(totallen+v[s][i].l>=minlen) continue;//基本最优性剪枝
            if(totallen+v[s][i].l>=minl[d][totalcost+v[s][i].t]) continue;//处处最优剪枝
            totalcost+=v[s][i].t;
            totallen+=v[s][i].l;
            minl[d][totalcost]=totallen;
            st[d]=1;
            dfs(d);
            st[d]=0;
            totalcost-=v[s][i].t;
            totallen-=v[s][i].l;
        }
    }
}

int main()
{
    cin>>k>>n>>r;
    int s;
    road R;
    for(int i=0;i<r;i++)
    {
        cin>>s>>R.d>>R.l>>R.t;
        if(s!=R.d) v[s].push_back(R);
    }
    memset(minl,0x3f,sizeof minl);
    st[1]=1;
    dfs(1);
    if(minlen<(1<<30)) cout<<minlen<<endl;
    else cout<<"-1"<<endl;
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-15 11:42:04  更:2022-05-15 11:42:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:04:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码