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

话不多说,直接看题:

首先,这个不是按照字典序的顺序,而是以只要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.mzph.cn/news/687645.shtml

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

相关文章

JVM常见问题笔记分享

文章目录 1 JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;1.2 什么是程序计数器&#xff1f;1.3 你能给我详细的介绍Java堆吗?元空间(MetaSpace)介绍 1.4 什么是虚拟机栈1.5 堆和栈的区别1.6 能不能解释一下方法区&#xff1f;1.5.1 概述1.5.2 常量池1…

项目一:高并发内存池

1. 项目介绍 1.1 这个项目是做什么的 当前项目是实现一个高并发的内存池&#xff0c;他的原型是 google 的一个 开源项目tcmalloc &#xff0c; tcmalloc 全称 Thread-Caching Malloc &#xff0c;即线程缓存的 malloc &#xff0c;实现了高效的多线程内存管理&#xff0c;用…

蓝桥杯备赛_python_BFS搜索算法_刷题学习笔记

1 bfs广度优先搜索 1.1 是什么 1.2怎么实现 2案例学习 2.1.走迷宫 2.2.P1443 马的遍历 2.3. 九宫重排&#xff08;看答案学的&#xff0c;实在写不来&#xff09; 2.4.青蛙跳杯子&#xff08;学完九宫重排再做bingo&#xff09; 2.5. 长草 3.总结 1 bfs广度优先搜索 【P…

1.初识Tauri

文章目录 一、前言二、基本认识三、js与rust通信四、构建应用 一、前言 原文以及后续文章可点击查看&#xff1a;初识Tauri。 Tauri是一款比较新的跨平台桌面框架&#xff0c;也是我目前最喜欢的一个框架&#xff0c;其官网为&#xff1a;Tauri 它的作用其实和Electron很像&…

【PyQt】在PyQt5的界面上集成matplotlib绘制的图像

文章目录 0 前期教程1 概述2 matplotlib2.1 库导入2.2 图片的各个部分解释2.3 代码风格2.4 后端 3 集成matplotlib图像到pyqt界面中3.1 使用到的模块3.2 理解Qt Designer中的“控件提升”3.3 界面与逻辑分离的思路3.4 扩展 0 前期教程 【PyQt】PyQt5进阶——串口上位机及实时数…

transformer-Attention is All You Need(一)

1. 为什么需要transformer 循环模型通常沿输入和输出序列的符号位置进行因子计算。通过在计算期间将位置与步骤对齐&#xff0c;它们根据前一步的隐藏状态和输入产生位置的隐藏状态序列。这种固有的顺序特性阻止了训练样本内的并行化&#xff0c;这在较长的序列长度上变得至关重…

STM32-开发工具

开发过程中可能用到的工具 1、烧录下载调试工具ST-LINK ST-LINK&#xff0c;是ST(意法半导体)推出的调试编程工具&#xff0c;适用于STM32系列芯片的USB接口的下载及在线仿真器。 2、串口调试工具/串口下载工具 串口调试工具是一种用于通过串口通信协议与目标设备进行数据交…

源码网打包,目前有3000多个资源

源码网打包&#xff0c;目前有3000多个资源 需要赶快下手吧&#xff0c;到手可以使用&#xff0c;搭建好和本站一样&#xff0c;全网唯一 优化缩略图演示&#xff1a;https://www.htm.ink默认缩略图演示&#xff1a;https://blog.htm.ink网站截图

c入门第十六篇——学生成绩管理系统

师弟&#xff1a;“师兄&#xff0c;我最近构建了一个学生成绩管理系统&#xff0c;有空试用一下么&#xff1f;” 我&#xff1a;“好啊&#xff01;” 一个简单的学生成绩管理系统&#xff0c;基本功能包括&#xff1a;添加学生信息、显示所有学生信息、按学号查找学生信息、…

网络安全习题集

第一章 绪论 4 ISO / OSI 安全体系结构中的对象认证安全服务使用&#xff08; C ) 机制来完成。 A &#xff0e;访问控制 B &#xff0e;加密 C &#xff0e;数字签名 D &#xff0e;数据完整性 5 身份鉴别是安全服务中的重要一环&#xff0c;以下关于身份鉴别的叙述不正确的是…

const--类的常量成员函数

在C中,为了禁止成员函数修改数据成员的值,可以将它设置为常量成员函数。设置常量成员函数的方法是在函数原型的后面加上const,形式如下: class x { …………… T f(t1,t2) const{} ………… }; 常量成员函数的作用&#xff1a; 将成员函数设置为const&#xff0c;表明该成员函…

FMEA的六大分类——SunFMEA软件

FMEA是一种预防性的质量工具&#xff0c;通过对产品设计或过程的故障模式进行分析&#xff0c;评估其可能产生的影响&#xff0c;从而采取相应的措施来降低产品的故障风险。根据分析的范围和目的&#xff0c;FMEA可以分为以下几种类型&#xff0c;今天sun fmea软件系统和大家一…

理解孟子思想,传承中华文化

为了更好地了解和传承中华文化&#xff0c;加深对孟子思想的认识与理解&#xff0c;探究孟子思想在现代社会的传承与发展&#xff0c;2024年2月18日&#xff0c;曲阜师范大学计算机学院“古韵新声&#xff0c;格物致‘知’”实践队队员崔本迪在山东省泰安市东平县进行了深入的调…

vue-路由(六)

阅读文章你可以收获什么&#xff1f; 1 明白什么是单页应用 2 知道vue中的路由是什么 3 知道如何使用vueRouter这个路由插件 4 知道如何如何封装路由组件 5 知道vue中的声明式导航router-link的用法 6 知道vue中的编程式导航的使用 7 知道声明式导航和编程式导航式如何传…

代码随想录算法训练营第33天| Leetcode1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

文章目录 Leetcode 1005.K次取反后最大化的数组和Leetcode 134. 加油站Leetcode 135. 分发糖果 Leetcode 1005.K次取反后最大化的数组和 题目链接&#xff1a;Leetcode 1005.K次取反后最大化的数组和 题目描述&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;按…

动态规划之编辑距离(接上一个题)

给定 n 个长度不超过 1010 的字符串以及 m 次询问&#xff0c;每次询问给出一个字符串和一个操作次数上限。 对于每次询问&#xff0c;请你求出给定的 n 个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。 每个对字符串进行的单个字符的插入、删除…

根据三维点坐标使用matplotlib绘制路径轨迹

需求&#xff1a;有一些点的三维坐标&#xff08;x&#xff0c;y&#xff0c;z&#xff09;&#xff0c;需要绘制阿基米德螺旋线轨迹图。 points.txt 0.500002, -0.199996, 0.299998 0.500545, -0.199855, 0.299338 0.501112, -0.199688, 0.298704 0.501701, -0.199497, 0.298…

Qt使用单例模式读取xml文件

Qt使用单例模式读取xml文件 一、单例模式介绍1、什么是单例模式2、为什么使用单例模式3、什么情况下使用单例模式4、使用单例模式需要注意哪些问题线程安全 5、单例模式的类型6、单例类的特点 2、单例模式的实现2.1懒汉式2.2饿汉式 一、单例模式介绍 1、什么是单例模式 单例模…

在Linux系统中设置HTTP隧道以实现网络穿透和端口转发

在数字化世界中&#xff0c;网络穿透和端口转发成为了许多开发者和系统管理员必备的技能。而在Linux系统中&#xff0c;通过设置HTTP隧道&#xff0c;我们可以轻松实现这一目标&#xff0c;让我们的服务即便在内网环境中也能被外部世界所访问。 那么&#xff0c;如何在Linux系…

一文搞懂设计模式—观察者模式

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 使用场景实现方式Java对观察者模式的支持Guava对观察者模式的支持Spring对观察者模式的支持 优缺点 观察者模式&#xff08;Observer Pattern&#xff09;是一种…