首页 > 其他分享 >AcWing 340. 通信线路

AcWing 340. 通信线路

时间:2023-07-10 12:33:19浏览次数:38  
标签:sta idx int max spfa 340 通信线路 dp AcWing

题目传送门:340. 通信线路 - AcWing题库

 

题目大致意思

对于一条路径,他的花费是,其经过的所以路线中花费最大的一条,你可以选择k条线,使其变为免费,求1到n的最小花费。

 

解题方法

本题可以用spfa加上dp来写。

对于同样是单源最短路,不可以用dijkstra的原因是:该题会将路径更改为0,如果用dijstra是不能更新已经确定的点,所以不可以使用。

为了做到更新点,我们使用队列优化的spfa。

我们知道普通的spfa是对于每一个点,扫描一边所以的边,但是队列优化的spfa是当影响该边的上一条边被更新,然后才更新该边,这样就不用扫描所有的边。

根据题意,我们可以用dp来表示费用,dp[x][p]表示从1~x,我们使用了p次免费的花费。如果有一条边x到y,花费为z加入,那么dp[y][p] = max(dp[x][p], z)。

接下来就是dp的公式,对于一条边,我们可以选择原价买下和让其免费。

那么我们可以得到dp[y][p] = min(dp[x][p - 1], max(dp[x][p], z))。其中dp[x][p-1]表示使用免费,max(dp[x][p], z)表示不使用免费。

 

AC代码:

#include <bits/stdc++.h>
using namespace std;

int ne[10010 * 2], e[10010 * 2], w[10010 * 2], h[1010], idx;
int dp[1010][1010];
int sta[1010];
int n, p, k;

void add(int x, int y, int z) // 邻接表建图
{
    e[idx] = y;
    w[idx] = z;
    ne[idx] = h[x];
    h[x] = idx++;
}

void spfa()
{
    queue<int> q;
    q.push(1);
    dp[1][0] = 0;
    sta[1] = 1;

    while (!q.empty())
    {
        int x = q.front();
        q.pop();
        sta[x] = 0;

        for (int i = h[x]; i != -1; i = ne[i])
        {
            int y = e[i], z = max(dp[x][0], w[i]); // 对于p = 0时
            if (dp[y][0] > z)
            {
                dp[y][0] = z;
                if (sta[y] == 0)
                {
                    sta[y] = 1;
                    q.push(y);
                }
            }

            for (int p = 1; p <= k; p++) // 对于p > 0时
            {
                z = min(dp[x][p - 1], max(dp[x][p], w[i]));
                if (dp[y][p] > z)
                {
                    dp[y][p] = z;
                    if (sta[y] == 0)
                    {
                        sta[y] = 1;
                        q.push(y);
                    }
                }
            }
        }
    }
}

void solve()
{
    cin >> n >> p >> k;

    for (int i = 1; i <= n; i++)
        h[i] = -1;

    memset(dp, 0x3f, sizeof(dp));

    for (int i = 1; i <= p; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;

        add(x, y, z);
        add(y, x, z);
    }

    spfa();

    int ans = 1e9;
    for (int i = 0; i <= k; i++)
        ans = min(dp[n][i], ans);

    if (ans == 1e9)
        cout << -1 << endl;
    else
        cout << ans << endl;

    return;
}

signed main()
{
    int _;
    // cin >> _;
    _ = 1;
    while (_--)
    {
        solve();
    }
}

 

标签:sta,idx,int,max,spfa,340,通信线路,dp,AcWing
From: https://www.cnblogs.com/is-land/p/17540761.html

相关文章

  • 山东大学考研机试--AcWing 3717. 整数序列
    题目描述很多整数可以由一连串的整数序列(至少两个数)相加而成,比如25=3+4+5+6+7=12+13。输入一个整数N,输出N的全部整数序列,如果没有则输出NONE。输入格式一个整数N。输出格式每行输出一个满足条件的整数序列。序列内部元素从小到大排序。优先输出首项更小的序列。数据......
  • BZOJ 3402: [Usaco2009 Open]Hide and Seek 捉迷藏 最短路
    3402:[Usaco2009Open]HideandSeek捉迷藏TimeLimit: 3Sec  MemoryLimit: 128MBSubmit: 213  Solved: 167[Submit][Status][Discuss]Description    贝茜在和约翰玩一个“捉迷藏”的游戏.    她正要找出所有适合她躲藏的安全牛棚.一共有N(2≤N≤20000......
  • 关于 AcWing 网站及延伸
    --AcWing 网站https://www.acwing.com/AcWing是一个在线编程学习平台,提供了各种算法和工程课程,以及丰富的题库和活动。你可以在AcWing上学习编程知识,刷题练习,参加比赛,或者和其他同学交流。AcWing的名字来源于英文单词“acwing”,意思是“飞翔”,寓意着帮助同学们在编程的......
  • AcWing,第108场周赛T3 拼接数组
    AcWing,第108场周赛T3前置知识:P1115最大子段和的dp和线段树作法分析:对于一个数组,可以直接求出最大字段和,但由于多个数组拼接在一起,没有办法直接求得拼接数组的最大字段和。求最大字段和我已知有两种方法:dp线段树先对每一个数组用线段树求出最大前缀和,最大字段和,最大后缀......
  • 【寒假每日一题】AcWing 4261. 孤独的照片(补)
    一、题目1、原题链接4261.孤独的照片2、题目描述FarmerJohn最近购入了N头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。奶牛目前排成一排,FarmerJohn想要为每个连续不少于三头奶牛的序列拍摄一张照片。然而,他不想拍摄这样的照片,其中只有一头牛的品种......
  • 【寒假每日一题】AcWing 4818. 奶牛大学(补)
    一、题目1、原题链接4818.奶牛大学2、题目描述FarmerJohn计划为奶牛们新开办一所大学!有N头奶牛可能会入学。每头奶牛最多愿意支付ci的学费。FarmerJohn可以设定所有奶牛入学需要支付的学费。如果这笔学费大于一头奶牛愿意支付的最高金额,那么这头奶牛就不会入学。Farm......
  • 【寒假每日一题】AcWing 4728. 乘方
    目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解 一、题目1、原题链接4728.乘方-AcWing题库2、题目描述小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a 和 b,求 a^b 的值是多少。a^b 即 b 个 a 相乘的值,例如......
  • AcWing 3662. 最大上升子序列和
    \(AcWing\)\(3662\).最大上升子序列和一、题目描述给定一个长度为\(n\)的整数序列\(a_1,a_2,…,a_n\)。请你选出一个该序列的严格上升子序列,要求所选子序列的各元素之和尽可能大。请问这个最大值是多少?输入格式第一行包含整数\(n\)。第二行包含\(n\)个整数\(a_......
  • 信驰达科技携手TI将CC2340推向更广市场领域
    根据蓝牙技术联盟(BluetoothSIG)2023年最新发布《2023年蓝牙市场最新资讯》,市调机构ABIResearch预测数据显示,蓝牙市场在未来五年将会实现高增长,蓝牙设备年出货量将保持强劲增长势头,预计到2027年将达76亿台,年复合增长率为9%,受外围设备持续强劲增长的推动,单模式低功耗蓝牙设备的出货......
  • 3.6万亿token、3400亿参数,谷歌大模型PaLM 2细节遭曝光
    谷歌内部文件又泄露了,这次是谷歌新一代大模型PaLM2的训练细节:训练数据量是前代的近5倍、参数量是前代的三分之二左右。上周四,在2023谷歌I/O大会上,谷歌CEO皮查伊宣布推出对标GPT-4的大模型PaLM 2,并正式发布预览版本,改进了数学、代码、推理、多语言翻译和自然语言生成......