【深搜 鄰接矩陣 && 鄰接表】【廣搜 鄰接矩陣 && 鄰接表 && 鄰接表+STL】求連通分量

題目

求一個圖的連通分量

在這裏插入圖片描述

輸入

n 頂點數(<=100)

輸出

連通分量

輸入樣例

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

輸出樣例

4

解題思路

深搜

從i點開始訪問,輸出並且標記,由此重複
當i的鄰接點搜完後繼續下一個點搜

廣搜

從i點開始訪問,再不斷的從下一個點繼續訪問,訪問到全部訪問完爲止

程序如下

程序解析到時更新
請諒解

深搜 鄰接矩陣

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,x,y,a[1001][1001],p[1001],c,ans;
int dfs(int w)
{
	p[w]=1;
	int fg=1;
	for(int i=1;i<=n;i++)
	{
		if(a[w][i]&&!p[i])
		{
			fg+=dfs(i);
		}
	}
	return fg;
}
struct s
{
	int y,next;
}q[10001];
int main()
{
	scanf("%d",&n);
	scanf("%d%d",&x,&y);
	while(x&&y)
	{
		a[x][y]=1;	
        a[y][x]=1;        
        scanf("%d%d",&x,&y);
	}
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,dfs(i));
	}
	printf("%d",ans);
	return 0;
} 


深搜鄰接表

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,x,y,a[1001][1001],p[1001],ans,k,g[1001];
struct s
{
	int t,next;
}q[10001];
int dfs(int w)
{
	p[w]=1;
	int h=1;
	for(int i=g[w];i;i=q[i].next)
	{
		if(!p[q[i].t])
		{
			h+=dfs(q[i].t);
		}
	}
	return h;
}
int main()
{
	scanf("%d",&n);
	scanf("%d%d",&x,&y);
	while(x&&y)
	{
		q[++k].t=y;
		q[k].next=g[x];
		g[x]=k;
        q[++k].t=x;
		q[k].next=g[y];
		g[y]=k;
		scanf("%d%d",&x,&y);
	}
	for(int i=1;i<=n;i++)
	{
		if(!p[i])
		{
			ans=max(ans,dfs(i));
		}
	}
	printf("%d",ans);
	return 0;
}


廣搜 鄰接矩陣

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,x,y,a[1001][1001],p[1001],ans;
struct s
{
	int y,next;
}q[10001];
int bfs(int i)
{
	int head=0,tail=1,stat[101],h,gg=1;
	memset(stat,0,sizeof(stat));
	stat[1]=i;
	p[i]=1;
	do
	{
		head++;
		for(int j=1;j<=n;j++)
		{
			if(a[stat[head]][j]&&!p[j])
			{
				tail++;
				gg++;
				p[j]=1;
				stat[tail]=j;
			}
		}
	}while(head<=tail);
	return gg;
} 
int main()
{
	scanf("%d",&n)	;
	scanf("%d%d",&x,&y);
	while(x&&y)
	{
		a[x][y]=1;
		a[y][x]=1;
		scanf("%d%d",&x,&y);
	}
	for(int i=1;i<=n;i++)
	{
		if(!p[i])
		{
			
			ans=max(ans,bfs(i));
		}
	}
	printf("%d",ans);
	return 0;
}


廣搜鄰接表

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,x,y,a[1001][1001],p[1001],ans,k,g[1001];
struct s
{
	int t,next;
}q[10001];
int bfs(int i)
{
	int head=0,tail=1,stat[101],gg;
	memset(stat,0,sizeof(stat));
	stat[1]=i;
	p[i]=1;
	do
	{
		++head;
		for(int j=g[stat[head]];j;j=q[j].next)
		{
			if(!p[q[j].t])
			{
				p[q[j].t]=1;
				stat[++tail]=q[j].t;
			}
		}
	}while(head<=tail);
	return tail;
}
int main()
{
	scanf("%d",&n);
	scanf("%d%d",&x,&y);
	while(x&&y)
	{
		q[++k].t=y;
		q[k].next=g[x];
		g[x]=k;
        q[++k].t=x;
		q[k].next=g[y];
		g[y]=k;
		scanf("%d%d",&x,&y);
	}
	for(int i=1;i<=n;i++)
	{
		if(!p[i])
		{
			ans=max(ans,bfs(i));
		}
	}
	printf("%d",ans);
	return 0;
}

+STL廣搜鄰接表+STL

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int n,x,y,a[1001][1001],p[1001],ans,k,g[1001];
struct s
{
	int t,next;
}q[10001];
int bfs(int i)
{
	int head=0,tail=1,gg;
	p[i]=1;
	queue<int>s;
	s.push(i);
	while(s.size())
	{
		int w=s.front();
		s.pop();
		for(int j=g[w];j;j=q[j].next)
		{
			if(!p[q[j].t])
			{
				tail++;
				p[q[j].t]=1;
				s.push(q[j].t);
			}
		}
	}
	return tail;
}
int main()
{
	scanf("%d",&n);
	scanf("%d%d",&x,&y);
	while(x&&y)
	{
		q[++k].t=y;
		q[k].next=g[x];
		g[x]=k;
        q[++k].t=x;
		q[k].next=g[y];
		g[y]=k;
		scanf("%d%d",&x,&y);
	}
	for(int i=1;i<=n;i++)
	{
		if(!p[i])
		{
			ans=max(ans,bfs(i));
		}
	}
	printf("%d",ans);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章