題目
求一個圖的連通分量
輸入
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;
}
#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;
}