図接続の問題-BFS

グラフ理論は根本的な問題がある、そしてそれは我々がこの問題を議論する必要があり、今日の接続性マップを決定する問題ではありません、私たちは絵がコンピュータで2つの表現、1つの隣接行列を持つことができることを知っている2隣接行列表現は、我々が議論し、最小スパニングツリーの問題を導入しているテーブルに隣接しており、今日は教室で隣接リストグラフで表さ接続の問題を議論する必要があります。BFSの方法によって解決要件。

入力

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

出力

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

サンプル入力

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

サンプル出力

Yes
No
#include<bits/stdc++.h>
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 bfs(int x)
{
    vis[x]=true;
    queue<int>q;
    q.push(x);
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        for(int i=g[now];i;i=e[i].next)
        {
            if(!vis[e[i].to])
            {
                vis[e[i].to]=true;
                q.push(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);
        }
        bfs(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<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int n,m,u,v;
bool vis[MAXN];
vector<int>G[MAXN];
void bfs(int x)
{
    vis[x]=true;
    queue<int>q;
    q.push(x);
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        for(auto &i:G[now])
        {
            if(!vis[i])
            {
                vis[i]=true;
                q.push(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);
        }
        bfs(1);
        bool f=true;
        for(int i=1;i<=n;++i)
        {
            if(!vis[i])
            {
                f=false;
            }
        }
        printf("%s\n",f?"Yes":"No");
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44061561/article/details/94449126