Description
求一个图的连通分量
Input
n 顶点数(<=100)
连接的边
Output
连通分量
Sample Input
8
6 3
1 2
2 5
5 4
4 1
8 7
0 0
Sample Output
4
分析
总的来讲,这题我分了5种做法:
1.DFS+邻接矩阵
2.DFS+邻接表
3.BFS+邻接矩阵
4.BFS+邻接表
5.BFS+邻接表+STL
方法一:用一个数组作为邻接矩阵存储,再DFS,要注意判断走过没有。
#include<iostream>
#include<cstdio>
using namespace std;
int n,x,y,a[101][101],p[101],ans,s;//a是矩阵
void dfs(int i)
{
p[i]=1;
for(int j=1;j<=n;j++)
{
if(a[i][j]&&!p[j])//看走过没
{
s++;//分量++
dfs(j);
}
}
}
int main()
{
cin>>n>>x>>y;
while(x!=0&&y!=0)
{
a[x][y]=1;
a[y][x]=1;
cin>>x>>y;
}
for(int i=1;i<=n;i++)
{
if(p[i]==0)
{
s=1;
dfs(i);
ans=max(ans,s);//选择最大的
}
}
cout<<ans;
return 0;
}
方法二:用DFS,但是用链表的方法存,搜索时就省了很多时间,不用一个一个过边。
#include<iostream>
#include<cstdio>
using namespace std;
int n,x,y,p[101],ans,s,k,b[101];
struct node