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
NO.1 dfs+邻接矩阵
#include<iostream>
using namespace std;
int m,n,k,x,y,map[101][101],a[10000];
void dfs(int x){
a[x]=1;
for(int i=1;i<=n;i++){
if(a[i]==0&&map[x][i]==1){
k++;
dfs(i);
}
}
}
int main(){
cin>>n;
cin>>x>>y;
while(x!=0&&y!=0){
map[x][y]=1;map[y][x]=1;
cin>>x>>y;
}
for(int i=1;i<=n;i++){
if(a[i]==0){
k=1;
dfs(i);
if(k>m)m=k;
}
}
cout<<m;
}
NO.2 dfs+邻接表
#include<iostream>
using namespace std;
struct node{
int next,x,y;
}a[100010];
int m,n,k,x,y,tot,head[100010],bz[10001];
void dfs(int x){
bz[x]=1;
for(int i=head[x];i;i=a[i].next){
if(bz[a[i].y]==0){
k++;
dfs(a[i].y);
}
}
}
void add(int x,int y){
tot++;
a[tot].x=x;
a[tot].y=y;
a[tot].next=head[x];
head[x]=tot;
}
int main(){
cin>>n;
cin>>x>>y;
while(x!=0&&y!=0){
add(x,y);add(y,x);
cin>>x>>y;
}
for(int i=1;i<=n;i++){
if(bz[i]==0){
k=1;
dfs(i);
if(k>m)m=k;
}
}
cout<<m;
}
NO.3 bfs+邻接矩阵
#include<iostream>
using namespace std;
int m,n,k,x,y,map[101][101],bz[1001];
struct node{
int x;
}b[100010];
void bfs(int v){
int head=0,tail=1;
b[1].x=v;bz[v]=1;
while(head<=tail){
head++;
for(int i=1;i<=n;i++){
if(bz[i]==0&&map[b[head].x][i]==1){
bz[i]=1;
tail++;
b[tail].x=i;
k++;
}
}
}
}
int main(){
cin>>n;
cin>>x>>y;
while(x&&y){
map[x][y]=1;map[y][x]=1;
cin>>x>>y;
}
for(int i=1;i<=n;i++){
if(bz[i]==0){
k=1;
bfs(i);
if(k>m)m=k;
}
}
cout<<m;
}
NO.4 bfs+邻接表
#include<iostream>
using namespace std;
int m,n,k,x,y,map[101][101],bz[1001],head[100010],tot;
struct node{
int next,x,y;
}a[100010];
struct ode{
int x;
}b[100010];
void add(int x,int y){
tot++;
a[tot].x=x;
a[tot].y=y;
a[tot].next=head[x];
head[x]=tot;
}
void bfs(int v){
int hd=0,tail=1;
b[1].x=v;bz[v]=1;
while(hd<=tail){
hd++;
int x=b[hd].x;
for(int i=head[x];i;i=a[i].next){
if(bz[a[i].y]==0){
bz[a[i].y]=1;
tail++;
b[tail].x=a[i].y;
k++;
}
}
}
}
int main(){
cin>>n;
cin>>x>>y;
while(x&&y){
add(x,y);add(y,x);
cin>>x>>y;
}
for(int i=1;i<=n;i++){
if(bz[i]==0){
k=1;
bfs(i);
if(k>m)m=k;
}
}
cout<<m;
}
NO.5 bfs+邻接表+STL
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int m,n,k,x,y,map[101][101],bz[1001],head[100010],tot;
struct node{
int next,x,y;
}a[100010];
void add(int x,int y){
tot++;
a[tot].x=x;
a[tot].y=y;
a[tot].next=head[x];
head[x]=tot;
}
void bfs(int v){
queue<int>b;
b.push(v);
bz[v]=1;
while(b.size()){
int x=b.front();b.pop();
for(int i=head[x];i;i=a[i].next){
if(bz[a[i].y]==0){
bz[a[i].y]=1;
b.push(a[i].y);
k++;
}
}
}
}
int main(){
cin>>n;
cin>>x>>y;
while(x&&y){
add(x,y);add(y,x);
cin>>x>>y;
}
for(int i=1;i<=n;i++){
if(bz[i]==0){
k=1;
bfs(i);
if(k>m)m=k;
}
}
cout<<m;
}