dfs和bfs综合利用,栈和队列也是综合利用,比较考验编程基本功,主要是自己交一次就对了,好高兴。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<stack>
using namespace std;
int gra[15][15],vis[15],ans[15],n;
queue<int>q;
stack<int>s;
int bfs(int st,int cnt)
{
int i,j,t;
while(!q.empty()) q.pop();
q.push(st);
while(!q.empty())
{
t=q.front();
q.pop();
for(i=0; i<n; i++)
{
if(gra[t][i]==1&&vis[i]==0)
{
ans[cnt]=i;
cnt++;
q.push(i);
vis[i]=1;
}
}
}
return cnt;
}
int dfs(int st,int cnt)
{
int i,t,flag;
while(!s.empty()) s.pop();
s.push(st);
while(!s.empty())
{
t=s.top();
flag=0;
for(i=0; i<n; i++)
{
if(gra[t][i]==1&&vis[i]==0)
{
ans[cnt]=i;
cnt++;
s.push(i);
vis[i]=1;
flag=1;
break;
}
}
if(!flag) s.pop();
}
return cnt;
}
int main()
{
int i,k,a,b,cnt,j;
while(~scanf("%d%d",&n,&k))
{
memset(gra,0,sizeof(gra));
for(i=0; i<k; i++)
{
scanf("%d%d",&a,&b);
gra[a][b]=gra[b][a]=1;
}
memset(vis,0,sizeof(vis));
for(i=0; i<n; i++)
{
if(!vis[i])
{
vis[i]=1;
ans[0]=i;
cnt=dfs(i,1);
printf("{ ");
for(j=0; j<cnt; j++)
{
printf("%d ",ans[j]);
}
printf("}\n");
}
}
memset(vis,0,sizeof(vis));
for(i=0; i<n; i++)
{
if(!vis[i])
{
vis[i]=1;
ans[0]=i;
cnt=bfs(i,1);
printf("{ ");
for(j=0; j<cnt; j++)
{
printf("%d ",ans[j]);
}
printf("}\n");
}
}
}
return 0;
}