建图(两种方式)
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;
}
并查集
初始化、寻根函数(路径压缩)、合并函数
并查集喜欢放在图里面考察
需要搞清楚哪些元素是用来合并的,
哪些元素是用来判断是否在同一集合的
放几个相关在图中考察并查集的题目链接
下面的并查集模板要背熟
#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();
}