PAT Template----Graph 2019.09.01

本文介绍了如何建立图的邻接矩阵和邻接链表,并详细讲解了深度优先搜索(DFS)和广度优先搜索(BFS)中的访问标志位与入队标志位。接着,文章探讨了在图问题中如何应用并查集,包括初始化、寻根、路径压缩和合并函数,强调理解哪些元素用于合并和判断集合关系。同时,提供了几个相关并查集题目链接以供练习。
摘要由CSDN通过智能技术生成

建图(两种方式)

1、二维数组建立邻接矩阵

2、一维固定二维变长vector建立邻接链表


DFS/BFS

在DFS中visit数组为 访问标志位

在BFS中visit数组为 入队标志位

有去除一个结点后,求全图连通分量 A1013

#include<cstdio>
#include<iostream>
#include<vector> 
#define MAX 1010
using namespace std;

vector<int>adl[MAX];
int n,m;
int visit[MAX]={0};

void dfs(int data)
{
	//visit在DFS中表示是否已访问-访问标志位
	visit[data]=1;
	for(int i=0;i<adl[data].size();i++)
	{
		if(visit[adl[data][i]]==0)
		  dfs(adl[data][i]);
	} 	
}

void bfs(int data)
{
	int que[MAX];
	int front=-1,rear=-1;
	que[++rear]=data;
	visit[data]=1;
	//visit在BFS中表示是否入队-入队标志位
	
	while(front!=rear)
	{
		int out=que[++front];
		for(int i=0;i<adl[out].size();i++)
		{
			if(visit[adl[out][i]]==0)
			{
				que[++rear]=adl[out][i];
				visit[adl[out][i]]=1;
			}
		}
	}
}

int traverseGraph()
{
	int num=0;
	for(int i=1;i<=n;i++)
	{
		if(visit[i]==0)
		{
//			dfs(i);
			bfs(i);
			num++;
		}
	}
	return num;
}


int main()
{
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int a,b;cin>>a>>b;
		adl[a].push_back(b);
		adl[b].push_back(a);
	}
	
    //打印连通分量
    cout<<traverseGraph()<<endl;

}

并查集

初始化、寻根函数(路径压缩)、合并函数

并查集喜欢放在图里面考察

需要搞清楚哪些元素是用来合并的,

哪些元素是用来判断是否在同一集合的

放几个相关在图中考察并查集的题目链接

PAT A1118   PAT A1107

下面的并查集模板要背熟

#include<cstdio>
#include<iostream>
#include<vector>
#include<set>
#define MAX 10010
using namespace std;
 
int father[MAX];
 
void init()
{
	for(int i=0;i<MAX;i++)
		father[i]=i;
}
 
int findFather(int x)
{
	if(x==father[x])return x;
	else
	{
		father[x] = findFather(father[x]);//compress path
		return findFather(father[x]);
	}
}
 
int merge(int a,int b)
{
	int faA=findFather(a);
	int faB=findFather(b);
	if(faA!=faB)father[faA]=faB;
}
 
 
int main()
{
	init();
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值