【个人模板】图的广度,深度优先遍历

#include<stdio.h>  
#include<bits/stdc++.h>  
using namespace std;  
int vis[101];  
int a[101][101];  
int n,m,sum;//n个点,m条边  
void dfs(int s)  
{  
    printf("%d ",s);  
    sum++;  
    if(sum==n)  
        return;  
    for(int i=1; i<=n; i++)  
    {  
        if(a[s][i]&&!vis[i])  
        {  
            vis[i]=1;  
            dfs(i);  
        }  
    }  
}  
void bfs()  
{  
    memset(vis,0,sizeof(vis));  
    queue<int>k;  
    for(int i=1; i<=n; i++)  
    {  
        if(!vis[i])  
        {  
            vis[i]=1;  
            printf("%d ",i);  
        }  
        k.push(i);  
        while(!k.empty())  
        {  
            int t=k.front();  
            k.pop();  
            for(int j=1; j<=n; j++)  
            {  
                if(!vis[j]&&(a[j][t]==1||a[t][j]==1))  
                {  
                    vis[j]=1;  
                    printf("%d ",j);  
                    k.push(j);  
                }  
            }  
        }  
    }  
}  
int main()  
{  
    while(scanf("%d%d",&n,&m)==2)  
    {  
        for(int i=1; i<=n; i++)  
        {  
            for(int j=1; j<=n; j++)  
            {  
                if(i==j)  
                    a[i][j]=0;  
                else  
                    a[i][j]=-1;  
            }  
        }  
        int x,y;  
        for(int i=0; i<m; i++)  
        {  
            scanf("%d%d",&x,&y);  
            a[x][y]=1;  
            a[y][x]=1;  
        }  
        vis[1]=1;  
        sum=0;  
        printf("dfs:\n");  
        dfs(1);  
        printf("\nbfs:\n");  
        bfs();  
        printf("\n");  
        for(int i=1; i<=n; i++)  
        {  
            for(int j=1; j<=n; j++)  
            {  
                printf(" %d到%d的距离:%d ",i,j,a[i][j]); ///-1表示无法到达  
            }  
            printf("\n");  
        }  
    }  
}  

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/qq_36344542/article/details/78398489
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞