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

话不多说,直接看题:

首先,这个不是按照字典序的顺序,而是以只要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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

⭐北邮复试刷题429. N 叉树的层序遍历(按层入队出队BFS)

429. N 叉树的层序遍历 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 1&#xff1a;输入&a…

VMware Workstation创建虚拟机

一、VMware Workstation下载安装 1、安装教程 VMware Workstation下载安装&#xff08;含密钥&#xff09; 二、VMware Workstation 创建虚拟机 1、新建虚拟机&#xff0c;点击“创建新的虚拟机” 2、选择自定义&#xff08;高级&#xff09;&#xff0c;点击“下一步” 3…

docker (六)-进阶篇-数据持久化最佳实践MySQL部署

容器的数据挂载通常指的是将宿主机&#xff08;虚拟机或物理机&#xff09;上的目录或文件挂载到容器内部 MySQL单节点安装 详情参考docker官网文档 1 创建对应的数据目录、日志目录、配置文件目录(参考二进制安装&#xff0c;需自己建立数据存储目录) mkdir -p /data/mysq…

Ps:污点修复画笔工具

污点修复画笔工具 Spot Healing Brush Tool专门用于快速清除图像中的小瑕疵、污点、尘埃或其他不想要的小元素。 它通过分析被修复区域周围的内容&#xff0c;无需手动取样&#xff0c;自动选择最佳的修复区域来覆盖和融合这些不完美之处&#xff0c;从而实现无痕修复的效果。 …

使用PaddleNLP UIE模型提取上市公司PDF公告关键信息

项目地址&#xff1a;使用PaddleNLP UIE模型抽取PDF版上市公司公告 - 飞桨AI Studio星河社区 (baidu.com) 背景介绍 本项目将演示如何通过PDFPlumber库和PaddleNLP UIE模型&#xff0c;抽取公告中的相关信息。本次任务的PDF内容是破产清算的相关公告&#xff0c;目标是获取受理…

解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

解释器模式 1.简介 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它用于定义语言的文法&#xff0c;并且解释语言中的表达式。在Java中&#xff0c;解释器模式可以用于构建解释器以解析特定的语言或表达式&#xff0c;如数学表达式、…

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日&#xff0c;OpenAI第一次发布人工智能聊天机器人ChatGPT&#xff0c;随后在全世界掀起了人工智能狂潮&#xff0c;颠覆了一个又一个行业。在过去的一年多的时间里&#xff0c;chatGPT的强大功能改变了越来越多人的工作和生活方式&#xff0c;成为了世界上用…

Open CASCADE学习|Geom_BSplineSurface转TopoDS_Face

B样条曲面&#xff08;B-Spline Surface&#xff09;是一种数学上用于描述三维形状的工具&#xff0c;它是B样条曲线在二维空间上的扩展。B样条曲面在计算机图形学、计算机辅助设计&#xff08;CAD&#xff09;、动画和许多其他领域都有广泛的应用。 B样条曲面由一组控制点和一…

使用八叉树模拟水和烟雾 Simulating Water and Smoke with an Octree Data Structure 论文阅读笔记

原文&#xff1a; Losasso, Frank, Frdric Gibou, and Ron Fedkiw. “Simulating water and smoke with an octree data structure.” Acm siggraph 2004 papers. 2004. 457-462. 引言 这篇文章扩展了 [Popinet 2003] 的工作&#xff0c;拓展到表面自由流&#xff0c;并且使…

数据输入时,数据的类型不匹配

一、问题背景 数据输入时&#xff0c;数据类型不匹配。此时输入失败&#xff0c;变量的值还是原来的值。 说明&#xff1a; 变量如果不做初始化&#xff0c;它的值是不确定的。 良好的编程习惯&#xff1a;变量在定义时&#xff0c;进行初始化&#xff0c;eg&#xff1…

- 项目落地 - 《选择项目工具的方法论》

本文属于专栏《构建工业级QPS百万级服务》 提纲&#xff1a; 选择大概率能完成业务目标的工具选择最适合的工具制作最适合的工具 本文所说的项目工具&#xff0c;泛指业务软件开发&#xff0c;所依赖的第三方提供的成熟的资源。包括但不限于开发语言、编辑工具、编译工具、三方…

怎样让MCU/SFU视频会议ovmedia 接入GB28281监控视频参会互动

在国内视频应用对GB监控接入是常规操作&#xff0c;很多系统需要接入监控视频交互处理。我们以ovmedia视频会议为例做一个接入互动。 GB28181协议在流媒体系统较为普及&#xff0c;我们以开源SRS系统对接监控端再接入会议&#xff08;也可以用商用GB流平台&#xff0c;操作基本…

Midjourney绘图欣赏系列(五)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

React18原理: React核心对象之ReactElement对象和Fiber对象

React中的核心对象 在React应用中&#xff0c;有很多特定的对象或数据结构.了解这些内部的设计&#xff0c;可以更容易理解react运行原理列举从react启动到渲染过程出现频率较高&#xff0c;影响范围较大的对象&#xff0c;它们贯穿整个react运行时 如 ReactElement 对象如 Fi…

OpenAl 视频生成模型 —— Sora技术报告解读

这里是陌小北&#xff0c;一个正在研究硅基生命的碳基生命。正在努力成为写代码的里面背诗最多的&#xff0c;背诗的里面最会写段子的&#xff0c;写段子的里面代码写得最好的…厨子。 写在前面 早上醒来&#xff0c;就看到OpenAl推出的视频模型Sora炸锅了&#xff0c;感觉所…

Windows环境部署nginx 文件服务器

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 在Windows环境下使用nginx部署简单的文件服务器 一、版本 1. Windows 使用版本 2. nginx 使用版本 选择Mainline Version版本 二、nginx配置 1. 下载 https://nginx.org/en/download.…

leetcode日记(31)缺失的第一个正数

挺简单的困难题 class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());int nnums.size();int i0;bool b0;if(nums[0]>0) b1;int p1;for(;i<n;i){if(i1>0&&i1<nums.size()&&nums[i]<…

Switch开关(antd-design组件库)简单使用

1.Switch开关 开关选择器。 2.何时使用 需要表示开关状态/两种状态之间的切换时&#xff1b; 和 checkbox 的区别是&#xff0c;切换 switch 会直接触发状态改变&#xff0c;而 checkbox 一般用于状态标记&#xff0c;需要和提交操作配合。 组件代码来自&#xff1a; 开关 Swit…

专业140+总410+合工大合肥工业大学833信号分析与处理综合考研经验电子信息与通信工程,真题,大纲,参考书。

经过一年努力奋战&#xff0c;今年初试总分410&#xff0c;其中专业课833信号分析与处理综合&#xff08;ss和dsp&#xff09;140&#xff08;感谢信息通信Jenny老师去年的悉心指导&#xff09;&#xff0c;数一130&#xff0c;顺利上岸&#xff0c;被合工大录取&#xff0c;看…

18-k8s控制器资源-cronjob控制器

job控制器是执行完一次任务&#xff0c;就结束&#xff1b; cronjob控制器&#xff0c;是基于job控制器&#xff0c;定期频率性执行任务&#xff1b;等同于linux系统中的crontab一样&#xff1b; 1&#xff0c;编辑cronjob资源清单 [rootk8s231 pi]# vim cronjob.yaml apiVers…