图论BFS DFS 列出连通集

列出连通集
本来以为很简单的,结果调试了近一下午也没搞通。还是查了题解。
题解代码链接这个不能直接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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值