无向图的深度遍历

#include<iostream>
#include<fstream>
using namespace std;
int e[100][100];        //无向图图采用邻接矩阵表示,一般的图采用数组,稀疏图可采用vector动态表示节约资源
int book[100];            //采用book数组记录节点是否已经访问过
int n,m;                //n个顶点,m条边
void dfs(int cur)
{
    cout<<cur<<" ";
    for(int i=1;i<=n;i++)
    {
        if(e[cur][i]==1&&book[i]==0)
        {
            book[i]=1;
            dfs(i);
        }
    }
}
int main()
{
    fstream f("1.txt");
    //f>>n>>m;
    cin>>n>>m;
    //初始化n维数组
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j)
                e[i][j]=0;
            else
                e[i][j]=99;
        }
    }
    //输入图的信息
    int x,y;
    for(int i=1;i<=m;i++)
    {
        //f>>x>>y;
        cin>>x>>y;
        e[x][y]=1;
        e[y][x]=1;
    }
    memset(book,0,sizeof(int));
    int count=0;
    for(int i=1;i<=n;i++)
    {
        if(book[i]==0)
        {
            book[i]=1;
            dfs(i);
            count++;
            cout<<endl;
        }
    }
    cout<<"该图共有"<<count<<"个连通分量"<<endl;
}

//记忆技巧,主循环里面三个for,前两个用来初始化图,后一个遍历每个连通分量
//关于dfs只需维护一个cur参数即可,对于点V来说,只要遍历它的周围即可(即一个for即可)

posted @ 2016-01-27 02:14  胡韬  阅读(661)  评论(0编辑  收藏  举报