单源最短路的建图

news2024/11/27 16:37:10

1.热浪

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)icon-default.png?t=N4P3http://ybt.ssoier.cn:8088/problem_show.php?pid=1379

很裸的单源最短路问题,n=2500,可以用dijksta或者spfa都能过,下面展示spfa的做法

#include<bits/stdc++.h>
using namespace std;
const int N=2510,M=6200*2+10;
int h[N],e[M],ne[M],w[M],idx;
int dist[N];
bool st[N];
int S,E;
void add(int a,int b,int c)
{
    w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int spfa()
{
    memset(dist,0x3f,sizeof dist);
    dist[S]=0;
    queue<int> q;
    q.push(S);
    st[S]=true;
    while(q.size())
    {
        int 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])
                {
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    return dist[E];
}
int main()
{
    int T,m;
    cin>>T>>m>>S>>E;
    memset(h,-1,sizeof h);
    for(int i=0;i<m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
    }
    cout<<spfa()<<endl;
    return 0;
}

 

2.信使

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

由于数据较小可以用Floyd算法求两两之间的最短路,然后后面更新一遍一号点到每一个点的最小距离即可

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int dist[N][N];
int n,m;
int flyd()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
            dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
    int ans=0;
    for(int i=2;i<=n;i++) ans=max(dist[1][i],ans);
    return ans;
}
int main()
{
   cin>>n>>m;
   memset(dist,0x3f,sizeof dist);
   for(int i=0;i<m;i++)
   {
       int a,b,c;
       cin>>a>>b>>c;
       dist[a][b]=dist[b][a]=min(dist[a][b],c);
   }
   int t=flyd();
   if(t==0x3f3f3f3f) puts("-1");
   else cout<<t<<endl;
    return 0;
}

3.香甜的黄油

1127. 香甜的黄油 - AcWing题库

枚举每一个农场,然后算一下总距离,然后更新每一个农场的最小值,用spfa求最小距离

#include<bits/stdc++.h>
using namespace std;
const int N=810,M=3000;
int h[N],e[M],ne[M],w[M],idx;
int id[N],dist[N];
int n,p,c;
bool st[N];
void add(int a,int b,int c)
{
    w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int spfa(int s)
{
    memset(dist,0x3f,sizeof dist);
    memset(st,0,sizeof st);
    queue<int> q;
    q.push(s);
    dist[s]=0;
    st[s]=true;
    while(q.size())
    {
        int 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])
                {
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int j=id[i];
        if(dist[j]==0x3f3f3f3f) return 0x3f3f3f3f;
       ans+=dist[j];
    }
    return ans;
}
int main()
{
    cin>>n>>p>>c;
    memset(h,-1,sizeof h);
    for(int i=1;i<=n;i++) cin>>id[i];
    for(int i=0;i<c;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
    }
    int ans=0x3f3f3f3f;
    for(int i=1;i<=p;i++) ans=min(ans,spfa(i));
    cout<<ans<<endl;
    return 0;
}

 

4.最小花费

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

算乘法的最短路,也就是把加法改成乘法即可,在求乘的最大值,dist初始化为0就行,用spfa可以过

#include<bits/stdc++.h>
using namespace std;
const int N=2010,M=2e5+10;
int h[N],e[M],ne[M],idx;
double w[M];
double dist[N];
int n,m;
int A,B;
bool st[N];
void add(int a,int b,double c)
{
    w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
double spfa()
{
    queue<int> q;
    q.push(A);
    dist[A]=1;
    st[A]=true;
    while(q.size())
    {
        int 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])
                {
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    return dist[B];
}
int main()
{
    cin>>n>>m;
    memset(h,-1,sizeof h);
    for(int i=0;i<m;i++)
    {
        int a,b;
        double c;
        cin>>a>>b>>c;
        c=(100-c)/100;
        add(a,b,c),add(b,a,c);
    }
    cin>>A>>B;
    double ans=100.0/spfa();
    printf("%.8lf",ans);
    return 0;
}

 

5.最优乘车

920. 最优乘车 - AcWing题库icon-default.png?t=N4P3https://www.acwing.com/problem/content/description/922/

 
  1. #include<bits/stdc++.h>
    using namespace std;
    const int N=510;
    int stop[N];
    int dist[N];
    bool g[N][N];
    int m,n;
    int q[N];
    int bfs()//用bfs求最短路,因为边权只有0 1.0表示不能乘坐的到,1表示能乘坐的到
    {
        memset(dist,0x3f,sizeof dist);
        dist[1]=0;
        q[0]=1;
        int hh=0,tt=0;
        while(hh<=tt)
        {
            int t=q[hh++];
            for(int i=1;i<=n;i++)
                 if(g[t][i]&&dist[i]>dist[t]+1)
                 {
                    dist[i]=dist[t]+1;
                    q[++tt]=i;
                 }
        }
        return dist[n];
    }
    int main()
    {
       cin>>m>>n;
        string line;
        getline(cin,line);
        while(m--)
        {
            getline(cin,line);
            stringstream ssin(line);
            int cnt=0,p;
            while(ssin>>p) stop[cnt++]=p;
            //将每个站点都连起来,说明有一条路能够通往
            for(int i=0;i<cnt;i++)
                for(int j=i+1;j<cnt;j++)
                   g[stop[i]][stop[j]]=true;
        }
        int t=bfs();
        if(t==0x3f3f3f3f) puts("NO");
        else cout<<bfs()-1<<endl;
        return 0;
    }

    6.昂贵的聘礼

    903. 昂贵的聘礼 - AcWing题库

    把0当作虚拟起点,假如是直接买的话就与0连条边,假如可以由其他物品替换的话加换的那个物品连被换的物品一条边

    等级制度就枚举一个区间内的等级制度即可。然后求最小值

  2. #include<bits/stdc++.h>
    using namespace std;
    const int N=110;
    int m,n;
    int w[N][N],level[N];
    bool st[N];
    int dist[N];
    int dijkstra(int down,int up)//一个是最小等级,一个是最大等级
    {
        memset(dist,0x3f,sizeof dist);
        memset(st,0,sizeof st);
        dist[0]=0;
        for(int i=1;i<=n;i++)
        {
            int t=-1;
            for(int j=0;j<=n;j++)
                if(!st[j]&&(t==-1||dist[j]<dist[t]))
                   t=j;
            if(st[t]) continue;
            st[t]=true;
            for(int j=1;j<=n;j++)
                if(level[j]>=down&&level[j]<=up)//等级得在这个范围
                   dist[j]=min(dist[j],dist[t]+w[t][j]);
        }
        return dist[1];//返回购买第一个物品的最小值
    }
    int main()
    {
        cin>>m>>n;
        memset(w,0x3f,sizeof w);
        for(int i=1;i<=n;i++) w[i][i]=0;
        for(int i=1;i<=n;i++)
        {
            int p,cnt;
            cin>>p>>level[i]>>cnt;
            w[0][i]=min(w[0][i],p);//从虚拟原点连一条边到物品i
            while(cnt--)//替代物
            {
                int id,cost;
                cin>>id>>cost;
                w[id][i]=min(w[id][i],cost);//从替代物连一条边到该物品
            }
        }
        int res=0x3f3f3f3f;
        for(int i=level[1]-m;i<=level[1];i++)//最小枚举level[1]-m,最大枚举level[1],因为要覆盖level[1]且长度为m
            res=min(res,dijkstra(i,i+m));
        cout<<res<<endl;
        return 0;
    }

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

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

相关文章

【蓝桥杯选拔赛真题58】Scratch打气球游戏 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch打气球游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

微信小程序——Git版本管理

一篇文章带你学会微信小程序中的Git版本管理 场景复现微信开发者工具中的Git连接远程仓库配置网络和认证提交工作区更改查看历史查看文件修改历史切换分支创建分支拉取、推送与抓取 微信官方开发文档&#xff1a;微信开放文档 场景复现 最近在前端的学习过程中&#xff0c;接触…

普通二本程序员想进大厂,我需要考研吗?好程序员来答!

最近好程序员看知乎有某网友提问&#xff1a; 1 普通二本&#xff0c;非科班出身&#xff0c;对Java感兴趣 2 已经开始工作半年了&#xff0c;普通技术 java 岗位 3 英语不好&#xff0c;四级没过&#xff0c;最高才 400 4 通过培训进入 java 岗位&#xff0c;基础知识不太好 5…

Python编程环境搭建:Linux(Ubuntu)系统安装Python

Linux 系统是为编程而生的&#xff0c;因此绝大多数的 Linux 发行版&#xff08;Ubuntu、CentOS 等&#xff09;都默认自带了 Python。有的 Linux 发行版甚至还会自带两个版本的 Python&#xff0c;例如最新版的 Ubuntu 会自带 Python 2.x 和 Python 3.x。 打开 Linux 发行版内…

浏览器相关开发事项

文章目录 存储浏览器持久化存储&#xff08;F12->应用->存储&#xff09;浏览器缓存&#xff08;F12->内存&#xff09;浏览器存储管理单位&#xff08;域名/IP为单位&#xff09;区别localStorage VS 浏览器缓存localStorage VS cookies 存储 浏览器持久化存储&…

Linux :: 【基础指令篇 :: (补充):(5)】:: 初步认识并解析文件详细信息内容:文件类型与用户访问权限说明、文件类型分类说明

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 经过了前面内…

如何理解数字化转型模式,适用于哪些企业?

如何理解「数字化转型」模式&#xff0c;适用于哪些企业&#xff0c;有何利弊&#xff1f; 这是一个很大的话题&#xff0c;本篇内容较长&#xff0c;全文6000字&#xff0c;心急的伙伴可先看目录&#xff0c;衷心希望以下内容能给大家带来帮助。&#xff08;如果担心一次看不…

案例分析 | 无代码助力国企数字化转型破旧立新

数字经济已成为国策&#xff0c;国企数字化转型更是排头兵&#xff0c;正成为数字化转型标杆。企业数字化转型是用信息技术全面重塑企业经营管理模式&#xff0c;是企业发展模式的变革与创新&#xff0c;是迈向数字经济时代的必然选择。 2022年9月底&#xff0c;国资委下发了重…

docker-compose启动mysql双机热备互为主从

1、环境准备 IP地址名称192.168.123.78mysql-m192.168.123.82mysql-s 2、安装mysql-m&#xff08;192.168.123.78&#xff09; 创建M主节点&#xff0c;通过下面的docker编排配置创建响应的目录和文件&#xff0c;目录下边创建 docker-compose.yml和my.cnf文件 docker-compo…

机器学习笔记 - 深度相机技术原理路线概览

一、深度相机的应用和原理 机器学习、人工智能、嵌入式视觉和处理技术的进步帮助创新者构建了能够在几乎没有人工监督的情况下导航环境的自主机器。此类设备的示例包括AMR(自主移动机器人),自动拖拉机,自动叉车等。 使这些设备真正自主需要它们能够在没有任何手动…

定时器搭配GPIO做定时扫描按键 -- STM32

STM32学习 定时器&#xff08;TIM&#xff09;定时器工作原理定时器相关参数相关函数和配置参数 通用输入/输出&#xff08;GPIO&#xff09;GPIO原理GPIO相关函数 实现定时扫描按键总结 在STM32F103系列的单片机应用中&#xff0c;定时器&#xff08;TIM&#xff09;和通用输入…

【名词解释】KiB和KB,MiB和MB,GiB和GB 等的区别以及1M带宽到底是多少?

目录 1. KiB和KB&#xff0c;MiB和MB&#xff0c;GiB和GB 2. 宽带速度 3. 单位换算 1. KiB和KB&#xff0c;MiB和MB&#xff0c;GiB和GB KiB和KB&#xff0c;MiB和MB&#xff0c;GiB和GB 等的区别: 1KB(kilobyte)10^31000byte, 1KiB(kibibyte)2^101024byte …

虹科干货 | 虹科Redis企业版数据库的延迟如此之小,proxy功不可没!

在Redis企业版集群的后台发生了许多事件&#xff0c;proxy&#xff08;代理&#xff09;隐藏了数据库客户端的所有活动。 大多数开发人员在构建应用程序时都会从小规模开始&#xff0c;使用简单的Redis开源&#xff08;Redis OSS&#xff09;数据库。在初期阶段&#xff0c;使用…

lnmp安装部署

文章目录 一、安装部署nginx二、安装部署mysql三、安装配置 PHP 解析环境四、部署 Discuz&#xff01;社区论坛 Web 应用 一、安装部署nginx 1、安装依赖包 systemctl stop firewalld setenforce 0 yum -y install pcre-devel zlib-devel gcc gcc-c make2、创建运行用户 use…

设计模式之~解释器模式

简述&#xff1a; 解释器模式&#xff0c;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 解释器模式需要解决的是&#xff0c;如果一种特定类型的问题发生的频率足够高&#xff0c;那么可…

基于安全产品DNS隧道流量分析

域名准备 选择哪家的云都没问题&#xff0c;这里我选择的TX云&#xff0c;因为之前注册过了&#xff0c;自己拿来做个流量分析不成问题。 域名添加解析记录 需要准备自己的vps作为DNS隧道的服务端&#xff0c;且需要添加ns记录 iodined 关闭53端口关闭开机自启 systemctl …

数据在内存中存储的真相来了!!!

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

【CMake报错】“检测到_ITERATOR_DEBUG_LEVEL和RuntimeLibrary不匹配” 的解决方案

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

外观模式详解:轻松搞定复杂子系统

一、概述 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为多个子系统中的操作提供一个统一的高层接口&#xff0c;用于访问复杂子系统的功能。其核心思想是通过一个外观类将子系统的复杂操作进行封装&#xff0c;客户端只需与外观类进行…

微信朋友圈如何批量发圈

做营销最重要的任务是什么&#xff1f; 毋庸置疑&#xff0c;就是发布朋友圈。 为什么要发圈呢&#xff1f; 发朋友圈是一种推广产品和服务的营销手段。 在如今社交媒体普及的时代&#xff0c;人们大多数时间都在线上&#xff0c;而朋友圈作为微信中的社交场景之一&#xff…