c++香甜的黄油(acwing)

news2024/11/25 6:30:16

农夫John发现了做出全威斯康辛州最甜的黄油的方法:糖。

把糖放在一片牧场上,他知道 N 只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。

当然,他将付出额外的费用在奶牛上。

农夫John很狡猾,就像以前的巴甫洛夫,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。

他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。

农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。

给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)。

数据保证至少存在一个牧场和所有牛所在的牧场连通

输入格式

第一行: 三个数:奶牛数 N,牧场数 P,牧场间道路数 C。

第二行到第 N+1 行: 1 到 N 头奶牛所在的牧场号。

第 N+2 行到第 N+C+1 行:每行有三个数:相连的牧场A、B,两牧场间距 D,当然,连接是双向的。

输出格式

共一行,输出奶牛必须行走的最小的距离和。

数据范围

1≤N≤500,
2≤P≤800,
1≤C≤1450,
1≤D≤255

输入样例:
3 4 5
2
3
4
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5

输出样例:

8

代码如下

dijkstra和spfa两个代码AC时间

第一个是spfa,第二个是dijkstra,但是我还是更喜欢dijkstra(heihei)

spfa

#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

typedef pair<int, int> PII;
const int N = 810, M = 3000, INF = 0x3f3f3f3f;

int n, p, m;//n是奶牛数量,p是牧场数量,m是道路数量
int h[N], w[M], e[M], ne[M], idx;
int dist[N], cnt[N];//cnt记录编号
bool st[N];

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}

int spfa(int u)
{
    memset(dist, 0x3f, sizeof dist);
    //memset(st, 0, sizeof st);//这里不需要每次清空st数组
    
    queue<int> q;
    
    dist[u] = 0;
    q.push(u);
    
    st[u] = true;
    
    while(q.size())
    {
        auto t = q.front();
        q.pop();
        
        st[t] = false;
        
        for(int i = h[t]; ~i; i = ne[i])
        {
            int j = e[i];
            if(dist[j] > dist[t] + w[i])
            {
                dist[j] = dist[t] + w[i];
                if(!st[j])
                {
                    st[j] = true;
                    q.push(j);
                }
            }
        }
    }
    
    int res = 0;
    for(int i = 0; i < n; i ++)
    {
        int j = cnt[i];
        if(dist[j] == INF) return INF;
        res += dist[j];把每次求的结果相加起来
    }
    return res;
}

int main()
{
    cin >> n >> p >> m;
    
    memset(h, -1, sizeof h);
    
    for(int i = 0; i < n; i ++) cin >> cnt[i];
    
    while(m --)
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c), add(b, a, c);
    }
    
    int t = INF;
    for(int i = 1; i <= p; i ++)
    {
        t = min(t, spfa(i));//求最小距离
    }
    
    cout << t << endl;
    
    return 0;
}

1、注意输入,总是输入出错误,哭死,因为每片牧场不只有一头牛,所以cnt数组记录牛的编号

然后注意道路是m,因为是求到牧场之间的距离和,所以是1到p

2、每次跑完最短路之后把每次的距离和相加起来

3、剩下的就是模板

dijkstra

#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

typedef pair<int, int> PII;
const int N = 810, M = 3000, INF = 0x3f3f3f3f;

int n, p, m;
int h[N], w[M], e[M], ne[M], idx;
int dist[N], cnt[N];
bool st[N];

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}

int dijkstra(int u)
{
    memset(st, 0, sizeof st);
    memset(dist, 0x3f, sizeof dist);
    
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, u});
    
    dist[u] = 0;
    
    while(heap.size())
    {
        auto t = heap.top();
        heap.pop();
        
        int ver = t.second, distance = t.first;
        
        if(st[ver]) continue;
        st[ver] = true;
        
        for(int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dist[j] > dist[ver] + w[i])
            {
                dist[j] = dist[ver] + w[i];
                heap.push({dist[j], j});
            }
        }
    }
    
    int res = 0;
    for(int i = 0; i < n; i ++)
    {
        int j = cnt[i];
        if(dist[j] == INF) return INF;
        res += dist[j];
    }
    
    return res;
}

int main()
{
    cin >> n >> p >> m;
    
    memset(h, -1, sizeof h);
    
    for(int i = 0; i < n; i ++) cin >> cnt[i];
    
    while(m --)
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c), add(b, a, c);
    }
    
    int t = INF;
    for(int i = 1; i <= p; i ++)
    {
        t = min(t, dijkstra(i));
    }
    
    cout << t << endl;
    
    return 0;
}

1、其实代码都相差不多,就是注意dijkstra每次都要清空st数组

2、希望小伙伴两种算法都能熟练地背下来,一个处理正权,一个处理友负权边的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双十一购物指南:电视盒子哪个牌子好?口碑电视盒子品牌排行榜

双十一可以说是年度最低价&#xff0c;我们都会在此时买买买&#xff0c;电视盒子作为日常必备销量同样火爆&#xff0c;近来很多朋友咨询小编电视盒子哪个牌子好&#xff0c;因此我整理了用户评价最高的电视盒子品牌排行榜&#xff0c;看完就知道哪些电视盒子最值得买了。 推荐…

mysql优化(关联表查询效率低下问题)

场景:表A和表B关联 A.id B.a_id 查询,并用表A的字段create_time排序(查询条件附带between create_time) 造成结果:explain结果如下,(查询结果耗时长) 原因:尚不明确. 解决方案:给B的a_id字段加上索引(create index index_a_id on B(a_id)),就解决了一部分问题.查询速度提升上…

pg 时间操作方法

1.概念 本质就是个宏定义&#xff0c;只是动态的 2.常用使用形式和函数 current_date &#xff1a;当前时间 current_timestamp&#xff1a;时间戳&#xff0c;更细 date ‘当前日期’ &#xff1a;指定日期 age&#xff08;日期1&#xff0c;日期2&#xff09;&#xf…

OpenWrt如何公网ssh远程连接【内网穿透】

文章目录 1.安装cpolar内网穿透2.配置SSH远程访问隧道3.公网远程连接4.固定远程连接地址 简单几步实现openWRT结合cpolar内网穿透工具实现远程ssh连接 1.安装cpolar内网穿透 cpolar是一个非常棒的跨平台、内网穿透工具&#xff0c;可以通过安全隧道将NAT或防火墙后面的本地服…

“5G+北斗”赋能千行百业,中海达亮相2023中国移动全球合作伙伴大会

10月12日&#xff0c;2023中国移动全球合作伙伴大会在广州保利世贸博览馆召开。本次活动以“算启新程 智享未来”为主题&#xff0c;重点展示中国移动全球合作伙伴在5G、终端、数智城市等方面的新产品、新技术和新服务。作为中国移动“朋友圈”战略合作企业及“北斗时空子链”链…

Python实现简易过滤删除数字的方法

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 如果想从一个含有数字&#xff0c;汉字&#xff0c;字母的列表中滤除仅含有数字的字符&#xff0c; 当然可以采取正则表达式来完成&#xff0c;但是有点太麻烦了…

【前端】vue在Windows平台IIS的部署

系列文章 【C#】IIS平台下&#xff0c;WebAPI发布及异常处理 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126539836 【Vue】vue2与WebApi跨域CORS问题 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133808959 文章目…

了解容器运行时安全:保护你的容器应用

前言 容器是一种虚拟化技术&#xff0c;用于封装和运行应用程序及其依赖项&#xff0c;以便在不同的计算环境中保持一致性和可移植性。自2013年容器诞生至今&#xff0c;容器Docker镜像的下载量超20亿&#xff0c;虽然容器行业发展如火如荼&#xff0c;但是其安全风险却不容乐…

软件测试定位bug方法+定位案例(详解)

1、问题bug定位技巧 首先&#xff0c;作为开发也好&#xff0c;测试也好&#xff0c;定位问题有一个总的思路&#xff0c;而这个思路是和数据的走向一致的。 大致是这样&#xff1a; 用户层面问题 -> Web页面/软件界面 -> 中间件 -> 后端服务 -> 代码 -> 数据…

Mac电脑日历怎么看状农历和事件?小历TinyCal怎么看农历日期

怎么设置电脑日期显示农历&#xff1f;电脑中如何查看万年历&#xff0c;电脑中快速查看万年历的方法。小历TinyCal mac版&#xff0c;是一款菜单栏日历软件&#xff0c;软件简洁大方、使用简单、操作方便&#xff0c;显示农历、节日节气和法定节假日&#xff0c;支持日历事件的…

轻松学会这招,给大量视频批量添加滚动字幕不求人

想要给大量视频批量添加滚动字幕不求人吗&#xff1f;下面就教你一个简单的方法。首先你需要下载并安装一款名为“固乔剪辑助手”的软件&#xff0c;这是一款非常专业的视频剪辑软件&#xff0c;它可以帮助你快速地给大量视频添加滚动字幕。 打开固乔剪辑助手软件后&#xff0c…

4年前,当我进入这家公司,便深感管理无力

有形的东西&#xff0c;看得见摸得着&#xff0c;只要有一道有形的围墙&#xff0c;管理也乱不到哪里去&#xff0c;可是这个行业的核心&#xff0c;是以合同为纽带的信息流管理。以长租合同为例&#xff0c;履约期限长达3年&#xff0c;涉及合同签约、归档、应收登记、实收登记…

Goland Cannot use ‘err‘ (type error) as the type any

问题描述&#xff1a; 用Goland写代码的时候&#xff0c;使用panic总是报错&#xff0c;官方用法也是报错&#xff0c;最后找到官方回复的链接&#xff0c;https://youtrack.jetbrains.com/issue/GO-12179/Cannot-use-err-type-error-as-the-type-any 问题解决方式&#xff1…

idea禁用双击ctrl

Run anything | IntelliJ IDEA Documentation Disable double modifier key shortcuts

Adaptive Homogeneity-DirectedDemosaicing Algorithm

Abstract 经济高效的数码相机使用单图像传感器&#xff0c;将红色、绿色和蓝色滤色镜的交替图案应用到每个像素位置。通过估计每个颜色平面中缺失的像素分量来重建彩色图像的完整三色表示的方法称为去马赛克算法。本文提出了通常与结合二维 (2-D) 方向插值的去马赛克算法相关的…

香港专家联名呼吁港府聚焦港元稳定币

2023年以来&#xff0c;市场对于 RWA&#xff08;Real World Assets&#xff09;即真实世界资产“代币化”的讨论愈发频繁&#xff0c;一些观点认为 RWA将在下一轮加密资产牛市中成为焦点&#xff0c;部分Web3创业者和传统金融企业也快速将业务方向瞄准相关赛道&#xff0c;而被…

平台系统老板驾驶舱的重要性,我选云表

平台系统老板驾驶舱的重要性在于它是一个集成的管理和分析工具&#xff0c;能够提供对平台系统运行情况的全面和实时的监控、分析和管理功能。以下是平台系统老板驾驶舱的重要性&#xff1a; 老板驾驶舱 该表单可供老板实时把控企业运营情况&#xff0c;包括销售业绩、…

博途PLC浮点数拆分为高低16位字(AT覆盖指令应用)

博途PLC对双整型数据进行高低16位拆分,还可以参考下面文章方法: 博途双字高低位转换32位双字拆分/合并操作(博途SCL源代码)_RXXW_Dor的博客-CSDN博客博途PLC的位、字节拆分和合并操作还可以参考下面的文章链接:博途PLC 位/字/字节 Bit/ Word/Byte拆分与合并_博途的bit-CSDN…

小黑第一次参加主持活动,没有出错被得到了鼓励,周日完赛人生中第一次山道马拉松的leetcode之旅:167. 两数之和 II - 输入有序数组

小黑代码 class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:# 数组长度n len(numbers)# 定义双指针head 0tail n - 1# 开始双指针操作while head < tail:if numbers[head] numbers[tail] < target:head 1elif numbers[head] nu…

如何让你的视频登上抖音热搜榜?

首先&#xff0c;了解抖音上的热门话题和趋势至关重要。抖音用户对什么话题感兴趣&#xff1f;哪些内容正在流行&#xff1f;你可以通过观察抖音上的热门视频、热门话题标签以及抖音热搜榜来获取这些信息。 一旦了解了当前的热门话题&#xff0c;你需要确保你的视频内容紧扣这些…