备战蓝桥杯---图论之建图基础

news2024/12/23 16:16:47

话不多说,直接看题:

首先,这个不是按照字典序的顺序,而是以只要1先做,在满足后让2先做。。。。

就是让数字小的放前面做+拓扑排序。

我们可以先做1,看看它的前驱。

举个例子:

我们肯定要把1放前面做,然后就确定把1的前驱及其相连放前面。

我们再看2,2没有,那就把2的前驱及其相连放1后面。

看3,我们把3,6放最前面,同理,把5,4放在3后面,于是我们可以得到63541.

我们发现这样子实现起来比较困难,这是因为限制关系造成的,我们知道首先要选的肯定在无前驱的点上,但至于要哪个无法根据现在的情况推断,这就造成了实现的复杂性。

于是,我们可以反着看,我们把边反一下,把取第1个的思路换成取倒数第n个,这样子,最后一个肯定在无前驱的点上,而我们只要选其中max的,然后再根据它解锁倒数第2个的可能的点。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int d,n,m,x,y,ans[100010],inc[100010],head[100010],cnt;
struct node{
    int next,dian;
}edge[100010];
priority_queue<int> q;
void merge(int x,int y){
    edge[++cnt].dian=y;
    edge[cnt].next=head[x];
    head[x]=cnt;
}
bool tuopu(){
    while(!q.empty()) q.pop();
    for(int i=1;i<=n;i++){
        if(inc[i]==0){
            q.push(i);
        }
    }
    int ck=0;
    while(!q.empty()){
        int hh=q.top();
        q.pop();
        ans[++ck]=hh;
        for(int i=head[hh];i!=-1;i=edge[i].next){
            inc[edge[i].dian]--;
            if(inc[edge[i].dian]==0) q.push(edge[i].dian);
        }
    }
    if(ck<=n-1) return 0;
    else return 1;
}
int main(){
    cin>>d;
    while(d--){
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        memset(inc,0,sizeof(inc));
        cnt=0;
        for(int i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            merge(y,x);
            inc[x]++;
        }
        if(tuopu()==0) printf("Impossible!\n");
        else{
            for(int i=n;i>=1;i--) printf("%d ",ans[i]);
            cout<<endl;
        }
    }
}

让我们再了解一下超级源点的应用吧:

我们再添加一个点使他与k个点的距离为0,因此,问题就转化成了单源点的问题,跑个迪杰斯特拉即可。

接题:

法1.BFS:

我们再记录一下当前走的方向,以转弯次数为顺序,用0/1BFS即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,zx,zy,sx,sy;
char a[105][105],c;
bool vis[105][105];
struct node{
    int x,y,dir,ci;
}qi;
int di[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
deque<node> q;
int bfs(node qi1){
    memset(vis,0,sizeof(vis));
    if(!q.empty()) q.pop_back();
    q.push_front(qi1);
    while(!q.empty()){
        node ck=q.front();
        vis[ck.x][ck.y]=1;
        q.pop_front();
        if(ck.x==zx&&ck.y==zy) {
            return ck.ci;
            }
        for(int i=0;i<4;i++){
            node hh;
            hh.x=ck.x+di[i][0];
            hh.y=ck.y+di[i][1];
            if(hh.x<=0||hh.y<=0||hh.x>n||hh.y>n) continue;
            if(a[hh.x][hh.y]=='x') continue;
            if(vis[hh.x][hh.y]==1) continue;
            if(ck.dir==abs(di[i][0])){
                q.push_front({hh.x,hh.y,ck.dir,ck.ci});
            }
            else{
                q.push_back({hh.x,hh.y,1-(ck.dir),ck.ci+1});  
            }
        }
    }
    return -1;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>c;
            a[i][j]=c;
            if(c=='A'){
                sx=i;
                sy=j;
            }
            if(c=='B'){
                zx=i;
                zy=j;
            }
        }
    }
    int a1=bfs({sx,sy,1,0});
    int b1=bfs({sx,sy,0,0});
    if(a1==-1||b1==-1) cout<<max(a1,b1);
    else cout<<min(a1,b1);
}

法2.建图:

下面为AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,sx,sy,zx,zy;
char a[105][105],c;
int head[100000],cnt;
struct node{
    int dian,len,next;
}edge[500000];
void merge(int x,int y,int v){
    edge[++cnt].dian=y;
    edge[cnt].len=v;
    edge[cnt].next=head[x];
    head[x]=cnt;
}
int dis[40000+10];
bool vis[40010];
struct ty{
    int dian,dis1;
    bool operator<(const ty &a) const{
        return dis1>a.dis1;
    }
};
priority_queue<ty> q;
int dij(int s,int t){
    q.push({s,0});
    dis[s]=0;
    while(!q.empty()){
        ty ck=q.top();
        q.pop();
        if(vis[ck.dian]==1) continue;
        vis[ck.dian]=1;
        for(int i=head[ck.dian];i!=-1;i=edge[i].next){
            int i1=edge[i].dian;
            if(vis[i1]==1) continue;
            if(dis[i1]>dis[ck.dian]+edge[i].len){
                dis[i1]=dis[ck.dian]+edge[i].len;
                q.push({i1,dis[i1]});
            }
        }
    }if(dis[t]>=0x3f) return -1;
     else return dis[t];
     
}
signed main(){
    cin>>n;
    memset(dis,0x3f,sizeof(dis));
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>c;
            a[i][j]=c;
            if(c=='A'){
                sx=i;
                sy=j;
            }
            if(c=='B'){
                zx=i;
                zy=j;
            }
        }
    }
    for(int i=1;i<=n*n;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                if(k!=j){
                    if((k+j)%2==0)  merge(4*(i-1)+j,4*(i-1)+k,0);
                    else merge(4*(i-1)+j,4*(i-1)+k,1);
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=2;j<=n;j++){
            if(a[i][j]=='x'||a[i][j-1]=='x'){
                merge((i-1)*4*n+(j-1)*4+1,(i-1)*4*n+(j-1)*4-1,0x3f);
                merge((i-1)*4*n+(j-1)*4-1,(i-1)*4*n+(j-1)*4+1,0x3f);
            }
            else{
                merge((i-1)*4*n+(j-1)*4+1,(i-1)*4*n+(j-1)*4-1,0);
                merge((i-1)*4*n+(j-1)*4-1,(i-1)*4*n+(j-1)*4+1,0);
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=2;j<=n;j++){
            if(a[j][i]=='x'||a[j-1][i]=='x'){
                merge((j-1)*4*n+(i-1)*4+2,(j-2)*4*n+(i-1)*4+4,0x3f);
                merge((j-2)*4*n+(i-1)*4+4,(j-1)*4*n+(i-1)*4+2,0x3f);
            }
            else{
                merge((j-1)*4*n+(i-1)*4+2,(j-2)*4*n+(i-1)*4+4,0);
                merge((j-2)*4*n+(i-1)*4+4,(j-1)*4*n+(i-1)*4+2,0);
            }
        }
    }
    for(int i=1;i<=4;i++) merge(n*n*4+1,4*(n*sx+sy-n-1)+i,0);
    for(int i=1;i<=4;i++) merge(4*(n*zx+zy-n-1)+i,n*n*4+2,0);
    
    cout<<dij(n*n*4+1,n*n*4+2);
}

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

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

相关文章

BIOS and UEFI

BIOS : Basic Input/Output System UEFI: Unified Extensible Firmware Interface Notes: 1. 两者都是主板上的firmware. 2. 两者的作用都包括开机后检查硬件&#xff0c;从硬盘上寻找bootloader(用于加载操作系统&#xff0c;例如GRUB). # 操作系统的启动过程&#xff1a…

VS2022创建控制台应用程序后没有Main了,该如何解决?

用VS2022创建一个控制台应用后&#xff0c;没有名称空间和Main函数了&#xff0c;只有一个WriteLine&#xff0c;如下所示。 // See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!");首先说明一下原因&#xff0c;在…

sqlserver对已有的表插入列

现有如下的一个表&#xff1b; 现在要插入一个 人员id 列&#xff1b;如下图在设计视图的行首单击&#xff0c;选择 插入列&#xff1b; 然后添加一个 人员id 列&#xff1b; 保存&#xff0c;出现下图提示&#xff0c;不能保存设计&#xff1b; 这就直接使用sql语句更改&#…

使用 Coze 搭建 TiDB 助手

导读 本文介绍了使用 Coze 平台搭建 TiDB 文档助手的过程。通过比较不同 AI Bot 平台&#xff0c;突出了 Coze 在插件能力和易用性方面的优势。文章深入讨论了实现原理&#xff0c;包括知识库、function call、embedding 模型等关键概念&#xff0c;最后成功演示了如何在 Coze…

wayland(xdg_wm_base) client 使用 dmabuf 最简实例

文章目录 前言一、zwp_linux_dmabuf_v1 协议二、wayland client 使用 zwp_linux_dmabuf_v1 协议传递dma-buf代码实例1. wayland_dmabuf.c 代码实例2. xdg-shell-protocol.c 和 xdg-shell-client-protocol.h3. linux-dmabuf-unstable-v1-client-protocol.h 和 linux-dmabuf-unst…

清华AutoGPT:掀起AI新浪潮,与GPT4.0一较高下

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域迎来了一个又一个突破。最近&#xff0c;清华大学研发的AutoGPT成为了业界的焦点。这款AI模型以其出色的性能&#xff0c;展现了中国在AI领域的强大实力。 目录 引言&…

SQL32 截取出年龄(substring_index函数的用法)

代码 select substring_index(substring_index(profile,,,3),,,-1) as age ,count(device_id) from user_submit group by age知识点 substring_index(FIELD, sep, n)可以将字段FIELD按照sep分隔&#xff1a; (1).当n大于0时取第n个分隔符(n从1开始)之前的全部内容&#xff1…

高速列车的空气动力学问题概述

1 高速铁路定义 高速铁路目前尚无全球统一的标准&#xff0c;普遍认定标准为新建线路上列车速度可达 250 km/h&#xff0c;或者既有线改造后可达 200 km/h 即可视为高速铁路。由于车辆、轨道、桥隧、调度、安全等多方面原因&#xff0c;当前没有用于货运用途的高速铁路&#x…

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)

目录 一.浏览器渲染原理 二.渲染时间点 三.渲染流水线 1.解析html(Parse HTML) 1.1解析成DOM树(document object model) 1.2解析成CSSOM树(css object model) 2.样式计算(Recalculate Style) 3.布局(Layout) 4.分层(Layer) 5. 绘制(Paint) 6.分块(Tiling) 7. 光栅化…

Leetcode1423.可获得的最大点数

文章目录 题目原题链接思路&#xff08;逆向思维&#xff09; 题目 原题链接 Leetcode1423.可获得的最大点数 思路&#xff08;逆向思维&#xff09; 由题目可知&#xff0c;从两侧选k张&#xff0c;总数为n张&#xff0c;即从中间选n - k张 nums总和固定&#xff0c;要选k张最…

深度学习基础之《TensorFlow框架(4)—Operation》

一、常见的OP 1、举例 类型实例标量运算add&#xff0c;sub&#xff0c;mul&#xff0c;div&#xff0c;exp&#xff0c;log&#xff0c;greater&#xff0c;less&#xff0c;equal向量运算concat&#xff0c;slice&#xff0c;splot&#xff0c;canstant&#xff0c;rank&am…

【TC3xx芯片】TC3xx芯片SMU模块详解

目录 前言 正文 1.SMU功能概述 1.1 SMU架构 1.2 SMU_core 1.3 SMU_stdby 2. SMU功能详述 2.1 SMU_core 2.1.1 Reset类型 2.1.2 接口&#xff08;Interfaces&#xff09;概述 2.1.2.1 SMU_core到SCU的接口 2.1.2.2 SMU_core到IR的接口 2.1.2.3 SMU_core到Ports(Err…

ClickHouse--06--其他扩展MergeTree系列表引擎

其他扩展MergeTree系列 MergeTree 系列表引擎 --种类 MergeTree 系 列 表 引 擎 包 含 &#xff1a; MergeTreeReplacingMergeTreeSummingMergeTree&#xff08;汇总求和功能&#xff09;AggregatingMergeTree&#xff08;聚合功能&#xff09;CollapsingMergeTree&#xff08…

Stable Diffusion webui安装详细教程

上一篇文章介绍了sd主流的ui&#xff0c;相信大家已经有所了解&#xff0c;下面为大家介绍sd-webui的安装详细教程 文章目录 一、 安装包说明二、对电脑的要求三、安装文件介绍四、安装步骤五、电脑问题与云主机六、界面简要说明及通用反向提示词 一、 安装包说明 通常我们使…

使用Python编写脚本-根据端口号杀掉进程

我的GitHub&#xff1a;Powerveil - GitHub 我的Gitee&#xff1a;Powercs12 - Gitee 皮卡丘每天学Java 从前段开始遇到一个问题&#xff0c;服务在启动的时候总是端口被占用&#xff0c;发现还是Java程序&#xff0c;但是当时并没有启动Java程序&#xff0c;电脑出问题了。 一…

基于结点电压法的配电网状态估计算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 结点电压法的基本原理 4.2 结点电压法在配电网状态估计中的应用 5.完整程序 1.程序功能描述 基于结点电压法的配电网状态估计算法.对配电网实施有效控制和操作的前提是实时数据库中数据…

【51单片机】AD模数转换DA数模转换(江科大)

1.AD/DA介绍 AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号 DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号 AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理…

JVM-垃圾回收(标记算法,收集器)

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 原资料地址&#xff1a;课程资料 垃圾回收的基本原理 1 什么是垃圾&#xff1f; 在…

Python爬虫之自动化测试Selenium#7

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 前言 在前一章中&#xff0c;我们了解了 Ajax 的分析和抓取方式&#xff0c;这其实也是 JavaScript 动态渲染的页面的一种情形&#xff0c;通过直接分析 Ajax&#xff0c;我们仍然可以借助 requests 或 urllib 来实现数据爬取…

算法练习-赎金信(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;哈希表 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…