列出连通集
本来以为很简单的,结果调试了近一下午也没搞通。还是查了题解。
题解代码链接这个不能直接AC需要调一下格式,空格。
自己敲了一遍、看看代码懂了一点,发现自己之前写的逻辑有问题。
现在仔细想想又不懂了。
这个代码返回值是int类型,但是return 的是BFS()这里我就不懂了。
int BFS()
{
queue<int> queue;
int i,j;
i = checkVisited();
if(i==-1)
return -1;
queue.push(i);
check[i] = 1;
printf("{ %d ",i);
while(!queue.empty())
{
int tempi = queue.front();
queue.pop();
for(j=0;j<Nv;j++)
if(graph[tempi][j]==1&&!check[j])
{
check[j]=1;
printf("%d ",j);
queue.push(j);
}
}
printf("}\n");
return BFS();
}
贴上我原来的代码吧 希望路过的朋友有兴趣可以帮忙找找bug,多谢~
还有个问题就是,我理解以为要输入多次,结果我的程序运行一次之后就输出不了结果了,不知道问题在哪里。有点莫名其妙……
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
#define N 20
int mapp[N][N]={0};
int v,e;
int u,w;
bool visit[N];
bool visit0[N];
queue<int>q;
void dfs(int x)
{
visit[x]=true;
printf(" %d ",x);
for(int i=0;i<v;i++)
{
if(!visit[i]&&mapp[x][i]==1)
{
dfs(i);
}
}
}
void bfs(int x)
{
visit0[x]=true;
int y;
q.push(x);
printf(" %d ",x);
while(!q.empty())
{
x = q.front();
q.pop();
for(int i=0;i<v;i++)
{
if(!visit0[i]&&(mapp[x][i]==1||mapp[i][x]==1))
{
visit0[i]=true;
printf(" %d ",i);
q.push(i);
}
}
}
}
int main()
{
while(~scanf("%d%d",&v,&e))
{
memset(visit,sizeof visit,false);
memset(visit0,sizeof visit0,false);
memset(mapp,sizeof(mapp),0);
for(int i=0;i<e;i++)
{
scanf("%d %d",&u,&w);
mapp[u][w]=1;
mapp[w][u]=1;
}
for(int i=0;i<v;i++)
{
if(visit[i])
continue;
else
{
printf("{");
dfs(i);
printf("}\n");
}
}
//memset(visit0,sizeof visit,false);
for(int i=0;i<v;i++)
{
if(visit0[i])
continue;
printf("{");
bfs(i);
printf("}\n");
}
}
return 0;
}