备战蓝桥杯---图论基础理论

图的存储:

1.邻接矩阵:

我们用map[i][j]表示i--->j的边权

2.用vector数组(在搜索专题的游戏一题中应用过)

3.用邻接表:

下面是用链表实现的基本功能的代码:

#include<bits/stdc++.h>
using namespace std;
struct node{int dian,zhi;struct node* next;
};
void insert(int x,int y,int z){node *p=new node;p->dian=y;p->zhi=z;p->next=head[x];head[x]=p;
}

4.用伪邻接表(链式前向星)(注意第一个next=-1,开始直接memset head=-1即可)

对于(1,3,30,-1)表示1的点指向3,边权为30,下一条边.

我们把这个存在edge[1]里,并令head[1]=1;

(3,6,10,-1),我们存在edge[2]里,并令head[3]=2;

(1,2,10,head[1]),我们存在edge【3】里,并让head[1]=3;

下面是实现的代码:

#include<bits/stdc++.h>
using namespace std;
struct node{int dian,zhi;int next;
};
void insert(int x,int y,int z){edge[++m].dian=y;edge[m].zhi=z;edge[m].next=head[x];head[x]=m;
}

欧拉图(前提是联通)

如果图的一个路径包括每个边恰好一次,则为欧拉路径。

欧拉路径+回路=欧拉回路。

具有欧拉回路的图为欧拉图,具有欧拉路径但无欧拉回路的图为半欧拉图

那么如何判断是否为欧拉图呢?

对于无向图,等价于该图所有顶点的度数为偶数(一进一出)+联通。

对于有向图,等价于该图所有顶点的入度==出度+联通。

拓扑排序

即按照一定的规则安排活动的先后次序(可能有多解)。

现在给一张图,a--》b表示要完成b必须先完成a,那我们如何排序呢?

1.先找没有前驱的点作为开始。

2.把它连着的边给删除,产生更多没有前驱的点作为下一步,入度-1。

3.删不动则无法完成

具体实现中,我们不能总是去跑入度为0的点。

于是,我们用一个队列。在删后发现入度为0的点就放入队列中即可。

下面是实现的代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
struct node{int dian;int next;
}edge[1000000];
int head[1010],inc[1010];
queue<int> q;
void insert(int x,int y){edge[++cnt].dian=y;edge[cnt].next=head[x];head[x]=cnt;
}
void tuopu(){for(int i=1;i<=n;i++){if(inc[i]==0) q.push(i);}int tot=0;while(!q.empty()){int x=q.front();q.pop();cout<<x<<endl;tot++;for(int i=head[x];i!=-1;i=edge[i].next){inc[edge[i].dian]--;if(inc[edge[i].dian]==0){q.push(edge[i].dian);}}}if(tot!=n) cout<<-1;
}
int main(){cin>>n>>m;memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){int x,y;cin>>x>>y;insert(x,y);inc[y]++;}tuopu();
}

拓扑排序的应用:

1.判断一个有向图是否有环,无环的图所有点都可以拓扑排序。

2.AOE网:

对于第一个,我们只用在拓扑排序上维护时间的max即可。

对于第二个,我们可以计算一下每一个活动的最早开始时间与最晚开始时间,因此我们相当于求最早开始时间等于最晚开始时间的点。

那么,我们如何求最晚开始时间呢?

我们只要从结尾反方向跑一回即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
struct node{int dian;int next;int zhi;
}edge[1000000];
int head[1010],inc[1010],shijian[1010];
queue<int> q;
void insert(int x,int y,int z){edge[++cnt].dian=y;edge[cnt].next=head[x];edge[cnt].zhi=z;head[x]=cnt;
}
void tuopu(){for(int i=1;i<=n;i++){if(inc[i]==0){q.push(i);shijian[i]=0;}}while(!q.empty()){int x=q.front();q.pop();for(int i=head[x];i!=-1;i=edge[i].next){inc[edge[i].dian]--;shijian[edge[i].dian]=max(shijian[edge[i].dian],shijian[x]+edge[i].zhi);if(inc[edge[i].dian]==0){q.push(edge[i].dian);}}}
}
int main(){cin>>n>>m;memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){int x,y,z;cin>>x>>y>>z;insert(x,y,z);inc[y]++;}tuopu();cout<<shijian[n];
}

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

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

相关文章

Promise与async await的作用及应用场景

在Web前端开发中&#xff0c;处理异步操作是非常常见的需求。为了解决这个问题&#xff0c;ES6引入了Promise和后续的async await。本文将介绍Promise和async await的作用&#xff0c;以及在实际开发中的应用场景。 一、Promise的作用及应用场景 Promise是一个表示异步操作最…

JavaWeb:关于登录认证的简单拓展

前提介绍 本文基于文章-------JavaWeb&#xff1a;SpringBootWeb登录认证 --黑马笔记 -------再做简单拓展 如果没有关于登录认证知识的基础&#xff0c;可以先看上面所说的的文章&#xff0c;文章在专栏javaweb中&#xff0c;下面我为了大家观看&#xff0c;直接放了链接。…

vue-进阶语法(四)

目录 v-model原理 v-model应用于组件 sync修饰符 ref 和 $refs&#xff08;重点&#xff09; $nextTick v-model原理 原理&#xff1a;v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写。 作用&#xff1a;提供数据的双向…

MySQL:常用指令

MySQL官网 一、在Windows 系统 cmd窗口里执行的命令 启动:net start MySQL停止:net stop MySQL卸载:sc delete MySQL 二、在macOS系统终端里执行的命令 启动&#xff1a;mysql.server start停止&#xff1a;mysql.server stop重启&#xff1a;mysql.server restart 三、执行帮…

使用Word Embedding+Keras进行自然语言处理NLP

目录 介绍&#xff1a; one-hot&#xff1a; pad_sequences: 建模: 介绍&#xff1a; Word Embedding是一种将单词表示为低维稠密向量的技术。它通过学习单词在文本中的上下文关系&#xff0c;将其映射到一个连续的向量空间中。在这个向量空间中&#xff0c;相似的单词在空间…

Docker 有哪些常见的用途?

Docker 是一种容器化技术&#xff0c;它允许应用程序在不同的环境之间具有一致的运行环境。这使得 Docker 在开发和运维领域中非常受欢迎&#xff0c;因为它简化了应用程序的部署和管理。以下是 Docker 的一些常见用途&#xff1a; 快速部署应用程序 Docker 允许开发人员和运…

Vuex 模块的详解

Vuex 模块是将 store 分割成多个模块的一种方式&#xff0c;每个模块都有自己的状态、mutations、actions 和 getters。这有助于更好地组织和管理应用程序的状态。 创建模块&#xff1a; 首先&#xff0c;需要创建一个模块。可以在 store 中定义一个新的模块对象&#xff0c…

分布式文件系统 SpringBoot+FastDFS+Vue.js

分布式文件系统 SpringBootFastDFSVue.js 一、分布式文件系统1.1.文件系统1.2.什么是分布式文件系统1.3.分布式文件系统的出现1.3.主流的分布式文件系统1.4.分布式文件服务提供商1.4.1.阿里OSS1.4.2.七牛云存储1.4.3.百度云存储 二、fastDFS2.1.fastDSF介绍2.2.为什么要使用fas…

操作系统(16)----磁盘相关

目录 一.磁盘相关概念 1.磁盘 2.磁道 3.扇区 4.盘面、柱面 5.磁盘的分类 二.磁盘调度算法 1.一次磁盘读/写操作需要的时间 2.先来先服务算法(FCFS) 3.最短寻找时间优先(SSTF) 4.扫描算法(SCAN) 5.LOOK调度算法 6.循环扫描算法(C-SCAN) 7.C-LOOK调度算法 三.减少…

Linux操作系统基础(十二):yum软件包管理器

文章目录 yum软件包管理器 一、yum常用命令 二、yum在线安装软件案例 三、yum在线删除软件案例 yum软件包管理器 yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat中的 Shell 前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的…

Gitee的使用教程(简单详细)

1.安装git&#xff08;我的电脑自带git&#xff0c;我没弄这步QAQ&#xff09; Git (git-scm.com)https://git-scm.com/ 安装好后在桌面点击鼠标右键会出现git GUI 和 git Bash&#xff08;没有的话点击显示更多选项&#xff09; 2.去gitee上注册一个账号 工作台 - Gitee.co…

python 基础知识点(蓝桥杯python科目个人复习计划39)

今日复习内容&#xff1a;排序 昨天晚上快睡的时候&#xff0c;脑子里就突然想到了排序&#xff0c;所以就打算再复习一遍相关知识点。 我先说一下冒泡排序&#xff0c;冒泡排序其实很好理解&#xff0c;比如有n个人排队&#xff08;从矮到高&#xff09;&#xff0c;先从这n…