首页 > 其他分享 >图论学习笔记

图论学习笔记

时间:2023-08-08 11:37:33浏览次数:40  
标签:图论 bb int 路径 笔记 学习 len push now

图论绘图在线

图是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系!点一般用字母v表示,如v1,v2,v3,v4image

一些简单的术语:

  • 路径:一些边组成的序列,满足第一条边的终点为第二条边的起点,第二条边的终点为第三条边的起点...如果边有权值,则我们把这些边权的和作为路径的长度;如果没有权值,则我们把边的条数作为路径的长度,即可以看作每条边的权值为1
  • 点/边的权值:点/边的属性,题目可能会用到。
  • 重边:起点与终点都相同的边被称为重边
  • 自环:点到自己有一条边
  • 简单路径:如果路径中没有经过重复点,则我们称这条路径为简单路径
  • 环:起点和终点相同的简单路径
  • 子图:在原图的边和点中选择一些保留下来,其他删除,就是子图
  • 连通性相关:两个点之间有路径,则称两点之间互相联通

存图

image
有以下边:

0 2
0 4
0 5
1 4
1 5
2 3
2 4
4 5

1.邻接矩阵

存储方式如下表:

\ v0 v1 v2 v3 v4 v5
v0 - - 1 - 1 1
v1 - - - - 1 1
v2 1 - - 1 1 -
v3 - - 1 - - -
v4 1 1 1 - - 1
v5 1 1 - - 1 -

每一条边(记为\((x,y)\))都将\(a[x][y]\)存为\((x,y)\)的长度(无向图也要把边\((y,x)\)存入)
但可以看到有很多-,也就是浪费了很多空间(开了\(n^2\)的空间却只用了m,一般\(m\le 2*n\))
所以可以优化

2.邻接表

0 2
0 4
0 5
1 4
1 5
2 3
2 4
4 5

存储方式如下表:

\ 1 2 3 4 5 6
v0 2 4 5 - - -
v1 4 5 - - - -
v2 0 3 4 - - -
v3 2 - - - - -
v4 0 1 2 5 - -
v5 0 1 4 - - -

后面还是有很多空,但可以动态分配空间(vector或链表实现)

vector实现

struct node{
	int to,len;
}//结构体
/////////////////////////////加边/////////////////////////////
void add(int x,int y,int s){
	v[x].push_back(node{y,i});
	//v[y].push_back(node{x,i});当为无向图时要反向加边
}
/////////////////////////////遍历/////////////////////////////
//单点
for(int i=0;i<v[x].size();i++)/*边为v[x][i]*/;
//dfs序
void dfs(int a,int s){
	if(b[a])return;
	b[a]=1;
	cout<<a<<" ";
	for(int i=0;i<v[a].size();i++){
		if(!b[v[a][i]])dfs(v[a][i],s+1);	
	}
}
//bfs序
void bfs(){
	queue<int>q;
	q.push(1);
	while(!q.empty()){
		int u=q.front();	
		q.pop();
		if(b2[u])continue;
		cout<<u<<" ";
		b2[u]=1;
		for(int i=0;i<v[u].size();i++)q.push(v[u][i]);
	}
}

链表实现

int e[N],cnt,h[N];
struct node{
	int to,len,next;
}//结构体
/////////////////////////////加边/////////////////////////////
void add(int x,int y,int s){
    e[++cnt].to=y;
    e[cnt].len=w;
    e[cnt].next=h[x];
    h[x]=cnt;
}
/////////////////////////////遍历/////////////////////////////
//单点
for(int i=h[x];i;i=e[i].next)/*用e[i]*/;
//dfs/bfs序遍历代码同

例题

P5318 【深基18.例3】查找文献

点击查看P5318代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int>v[550000];
int n,m,l,r,T,b[550010]={0},b2[550010]={0};
void dfs(int a,int s){
	if(b[a])return;
	b[a]=1;
	cout<<a<<" ";
	for(int i=0;i<v[a].size();i++){
		if(!b[v[a][i]]){
			dfs(v[a][i],s+1);	
		}
	}
}
void bfs(){
	queue<int>q;
	q.push(1);
	while(!q.empty()){
		int u=q.front();	
		q.pop();
		if(b2[u])continue;
		cout<<u<<" ";
		b2[u]=1;
		for(int i=0;i<v[u].size();i++){
			q.push(v[u][i]);	
		} 
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>l>>r;
		v[l].push_back(r);
	}
	for(int i=1;i<=n;i++){
		sort(v[i].begin(),v[i].end());
	}
	dfs(1,0);
	cout<<endl;
	bfs();
	return 0;
}

B3643 图的存储
B3613 图的存储与出边的排序
P3916 图的遍历

最短路

SPFA

它死了

int spfa(int x){
	memset(b,0,sizeof(b));
	for(int i=0;i<=n;i++)dis[i]=1e18;
	queue<int>q;
	q.push(1);
	b[1]=1;
	dis[1]=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		b[u]=0;
		for(int i=0;i<v[u].size();i++){
			int a=v[u][i].to,s=v[u][i].len;
			if(dis[u]+s<dis[a]){
				dis[a]=dis[u]+s;
				if(!b[a]){
					b[a]=1;
					q.push(a); 
				}
			}
		}	
	}
	return dis[n];
}

Dijkstra(堆优化)

struct dj{
	int dis,bb;
	bool operator < (const dj &a) const{
		return a.dis<dis;
	}
};
void dijkstra(){
	priority_queue<dj>q;
	for(int i=1;i<=n;i++)dis[i]=1e18;
	dis[1]=0;
	q.push((dj){0,1});
	while(!q.empty()){
		dj now=q.top();
		q.pop();
		if(vis[now.bb])continue;
		vis[now.bb]=true;
		for(int i=0;i<v[now.bb].size();i++){
			if(dis[v[now.bb][i].to]>dis[now.bb]+v[now.bb][i].len){
				dis[v[now.bb][i].to]=dis[now.bb]+v[now.bb][i].len;
				q.push((dj){dis[v[now.bb][i].to],v[now.bb][i].to});
			}
		}
	}
}

标签:图论,bb,int,路径,笔记,学习,len,push,now
From: https://www.cnblogs.com/ccr-note/p/tulun.html

相关文章

  • 4.深度学习(1) --神经网络编程入门
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • Hexagon之SmartPlant Foundation基础架构学习
    1SmartPlantFoundation简介SmartPlantFoundation是SmartPlantEnterprise解决方案的信息集成平台,是专门针对石油、化工行业的解决方案(SDx是通用形的),实现工厂全生命周期的数字化资料,包括设计、采购、收购、运营和维护。SmartPlantFoundation使用位号管理让用户基于已有的架构......
  • protobuf学习笔记
    1下载protoc编译器源代码和可执行文件下载:下载地址可根据不同的系统,下载对应的可执行文件,用于编译.proto文件示例C++的命令方式为:protoc.exe--cpp_out=./demo.proto,就可以生成对应的demo.pb.h和demo.ph.cc源代码安装vcpkg下载地址forwindows:>gitclonehttps://githu......
  • win7系统笔记本作为wifi热点提供无线连接
    只有有线没有路由器的可以用win系统的笔记本设置,给手机或者其他的笔记本提供无线连接 步骤如下:首先确认你的无线网卡可以使用。在开始菜单中依次找到“所有程序”--“附件”--“命令提示符”,右键“以管理员身份运行”。如下图所示:在“命令提示符”里输入“netshwlansethost......
  • 论文解读:《基于深度多核学习的用于识别 DNA n4 -甲基胞嘧啶位点的高阶模糊推理系统》
    Title:Adeepmultiplekernellearning-basedhigher-orderfuzzyinferencesystemforidentifyingDNAN4-methylcytosinesites期刊:InformationSciences中科院分区:一区(计算机科学技术)影像因子:8.1↓0.133文章链接:https://doi.org/10.1016/j.ins.2023.01.149Websever:Github:......
  • 笔记 | 类数组与数组扁平化
    一、类数组Array-like在日常中能接触到的类数组有这么几个:参数对象arguments;通过querySelector获取的NodeList;NodeList对象是节点集合,NodeList可以使用for...of来迭代,在一些情况下,NodeList是一个实时合集;通过函数:getElementsByTagNamegetElementsByClass......
  • JavaScript 基础(1) - 笔记
    1JavaScript基础1.1JavaScript是什么1.JavaScript(是什么?)是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。2.作用(做什么?)网页特效(监听用户的一些行为让网页做出对应的反馈)表单验证(针对表单数据的合法性进行判断)数据交互(获取后台的数据,渲染到前端)服务端编程(node.js......
  • 扫描线学习笔记
    0.写在前面扫描线好闪,拜谢扫描线1.问题的引入在一个二维的坐标系上,给出多个矩形,求他们的面积并2.问题的分析假设我们有这么一张图你要求这三个矩形的面积并,可以考虑容斥原理,但这样会TLE但总之,他最终的结果是围成了一个多边形那你不妨考虑,重新分割这个最终的图形那......
  • c#关于终止thread 学习经典
    C#多线程学习笔记之(abort与join配合使用)转载:************   原文中的评论,有便于理解的内容*************************C#多线程学习笔记之(abort与join配合使用)  今天刚开始学多线程,尽管以前用过一点点,但是只是照着网上代码抄,没有真正理解,现在回过头来想研究研究,......
  • tensorflow猫狗大战笔记
    第一步:数据集的加工importcv2importos#使用os.walk()函数遍历指定文件夹train及其所有子文件夹。dir='train'#读取图片路径的设定需要在程序文件里建立train文件夹将需要更改尺寸的图片放入forroot,dirs,filesinos.walk(dir):#forroot,dirs,filesinos.walk......