图的连通性问题-DFS

图论中有一个基本的问题,那就是一个无向图的连通性判别问题,今天我们就来讨论这个问题,我们知道,在计算机中一张图可以有两种表示方法,一是邻接矩阵二是邻接表,其中的邻接矩阵表示方法,我们已经在课堂上介绍最小生成树问题时讨论过,今天我们就来讨论用邻接表表示的图的连通性问题。要求用DFS方法求解。

Input

本问题有多组测试数据,每组测试数据有两部分,第一部分只有一行,是两个正整数,分别表示图的节点数N(节点编号从1到N,1<=N<=100)和图的边数E;第二部分共有E行,每行也是两个整数N1,N2(1<=N1,N2<=N),分别表示N1和N2之间有一条边。

Output

对于每一组测试数据,输出只有一行,如果是连通图,那么输出“Yes”,否则输出“No”。

Sample Input

6 10
1 2
1 3
1 4
1 5
1 6
2 3
2 4
3 4
3 5
3 6
4 3
1 2
1 3
2 3

Sample Output

Yes
No
#include
using namespace std;
const int MAXN=100005;
int g[MAXN],tot,n,m,u,v;
bool vis[MAXN];
struct edge
{
    int to,next;
}e[MAXN];
void add_edge(int from,int to)
{
    e[++tot].to=to;
    e[tot].next=g[from];
    g[from]=tot;
}
void dfs(int x)
{
    vis[x]=true;
    for(int i=g[x];i;i=e[i].next)
    {
        if(!vis[e[i].to])
        {
            dfs(e[i].to);
        }
    }
    return;
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        tot=0;
        for(int i=1;i<=n;++i)
        {
            g[i]=0;
            vis[i]=false;
        }
        for(int i=1;i<=m;++i)
        {
            scanf("%d %d",&u,&v);
            add_edge(u,v);
            add_edge(v,u);
        }
        dfs(1);
        bool f=true;
        for(int i=1;i<=n;++i)
        {
            if(!vis[i])
            {
                f=false;
            }
        }
        printf("%s\n",f?"Yes":"No");
    }
    return 0;
}
#include
using namespace std;
const int MAXN=100005;
int tot,n,m,u,v;
bool vis[MAXN];
vector<int>G[MAXN];
void dfs(int x)
{
    vis[x]=true;
    for(auto &i:G[x])
    {
        if(!vis[i])
        {
            dfs(i);
        }
    }
    return;
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;++i)
        {
            G[i].clear();
            vis[i]=false;
        }
        for(int i=1;i<=m;++i)
        {
            scanf("%d %d",&u,&v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        dfs(1);
        bool f=true;
        for(int i=1;i<=n;++i)
        {
            if(!vis[i])
            {
                f=false;
            }
        }
        printf("%s\n",f?"Yes":"No");
    }
    return 0;
}

你可能感兴趣的:(数据结构与算法)