【图论】求连通分量【深搜】(两种方法)【广搜】(两种方法)

题目:

求一个图的连通分量

输入:

n 顶点数(<=100) 边

样例输入:

8
6 3
1 2
2 5
5 4
4 1
8 7
0 0

输出:

连通分量。

样例输出:

4

思路:

这道题可以用四种方法(DFS+邻接矩阵、DFS+邻接表、BFS+邻接矩阵、BFS+邻接表)来做

DFS:

从某一初始出发点i开始访问: 输出该点编号;并对该点作被访问标志(以免被重复访问)。

再从i的其中一个未被访问的邻接点j作为初始点出发继续深搜。

当i的所有邻接点都被访问完,则退回到i的父结点的另一个邻接点k再继续深搜。

直到全部结点访问完毕

BFS:

按层次遍历来搜索,也就是一层一层地往下搜,直到图中所有所有可被访问的结点都被访问到。

那么,我们就可以利用DFS&&DFS来

作这一题了。

方法一:

D F S + 邻 接 矩 阵 DFS+邻接矩阵 DFS+

代码:

#include
#include
using namespace std;
int a[101][101],b[101];
int n,x,y,s,ans;
void dfs(int i)//深搜过程
{
	b[i]=1;
	for(int j=1;j<=n;j++)
		if (a[i][j]&&!b[j])
	    ++s,dfs(j);
}
int main()
{
	scanf("%d%d%d",&n,&x,&y);//输入
	while(x&&y)
	{
	    a[x][y]=a[y][x]=1;//标记。
		scanf("%d%d",&x,&y);//输入。
	}
		for (int i=1;i<=n;i++)
	if (!b[i])
	{
		b[i]=1,s=1,dfs(i);//无向图,所以两点连通//调用dfs
		ans=max(ans,s);//选答案。
	}
	printf("%d",ans);//输出。
	return 0;
}

方法二:

D F S + 邻 接 表 DFS+邻接表 DFS+

想法:用邻接表存比邻接矩阵更快。

代码:

#include
#include
using namespace std;
struct node//结构体。
{
  int y,next;
}
e[10001];
int v[101],n,x,y,s,ans,k,ls[101];
void dfs(int i)//深搜过程。
{
    v[i]=1;
	for (int j=ls[i];j;j=e[j].next)
	if (!v[e[j].y]) 
	++s,dfs(e[j].y);
}
int main()
{
  scanf("%d%d%d",&n,&x,&y);//输入
  while(x&&y)
  {
  	e[++k]=(node){y,ls[x]}; ls[x]=k;//邻接表。
    e[++k]=(node){x,ls[y]}; ls[y]=k;
    scanf("%d%d",&x,&y);//输入。
  }
  for (int i=1;i<=n;i++)//与第一种一样
	if (!v[i])
	{
		v[i]=1,s=1,dfs(i);//调用dfs
		ans=max(ans,s);
    }
    printf("%d",ans);//输出。
  return 0;	
}

方法三:

B F S + 邻 接 矩 阵 BFS+邻接矩阵 BFS+

代码:

#include
#include
using namespace std;
int a[101][101],b[101];
int n,x,y,s,ans;
void bfs(int i){//广搜过程,一层一层搜。
	int head=0,tail=1,stat[101];
	stat[1]=i;
	do{
		++head;
		for (int j=1;j<=n;j++)
		if (a[stat[head]][j]&&!b[j]){
			b[j]=1; ++s;
			stat[++tail]=j;
		}
	}while (head<tail);
}
int main()
{
	scanf("%d%d%d",&n,&x,&y);//输入。
	while(x&&y)
	{
	    a[x][y]=a[y][x]=1;//无向图可连通
		scanf("%d%d",&x,&y);
	}
		for (int i=1;i<=n;i++)
	if (!b[i])//与方法一差不多
	{
		b[i]=1,s=1,bfs(i);//调用bfs
		ans=max(ans,s);//取答案
	}
	printf("%d",ans);//输出。
	return 0;
}

方法四:

B F S + 邻 接 表 BFS+邻接表 BFS+

想法:用邻接表存比邻接矩阵更快。

代码:

#include
#include
using namespace std;
struct node//结构体
{
  int y,next;
}
e[10001];
int v[101],n,x,y,s,ans,k,ls[101];
void bfs(int i){//广搜过程,类似方法三。
	int head=0,tail=1,stat[101];
	stat[1]=i;
	do{
		++head;
		for (int j=ls[stat[head]];j;j=e[j].next)
		if (!v[e[j].y]){
			v[e[j].y]=1; ++s;
			stat[++tail]=e[j].y;
		}
	}while (head<tail);
}

int main()
{
  scanf("%d%d%d",&n,&x,&y);//输入。
  while(x&&y)
  {
  	e[++k]=(node){y,ls[x]}; ls[x]=k;//邻接表,类似第二种。
    e[++k]=(node){x,ls[y]}; ls[y]=k;
    scanf("%d%d",&x,&y);//输入。
  }
  for (int i=1;i<=n;i++)//与前三种一样
	if (!v[i])
	{
		v[i]=1,s=1,bfs(i);//调用bfs
		ans=max(ans,s);//选答案。
    }
    printf("%d",ans);
  return 0;	
}

你可能感兴趣的:(深搜,图论,广搜,模板)