欧拉路(一) HihoCoder - 1176

题目链接点击: HihoCoder - 1176

欧拉路:

  1. 无向图存在欧拉路,当且仅当该图只存在   2个或者0个(0个即欧拉回路)   点为的度(入度+出度)为奇数,且该图是连通图。(本题判断条件+并查集找根)
  2. 有向图存在欧拉路,当且仅当 两个点度为奇数(一个入度比出度少1,,另一个反之),其他所有顶点的入度等于出度,且该图是连通图。

欧拉回路:

  1. 无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
  2. 有向图存在欧拉回路,当且仅当所有顶点的入度等于出度,且该图是连通图。
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e4+5;
    int du[maxn],fa[maxn];
    int n,m,i,j,a,b;
    int Find(int x)
    {
        if(fa[x] == x) return x;
        return fa[x] = Find(fa[x]);
    }
    int main()
    {
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            memset(du,0,sizeof du);
            for(i = 1; i <= n; i++) fa[i] = i;
            for(i = 0; i < m; i++)
            {
                scanf("%d %d",&a,&b);
                du[a]++;
                du[b]++;
                int a1 = Find(a),b1 = Find(b);
                if(a1!=b1) fa[a1] = b1;
            }
            int cnt = 0,cnt1 = 0;
            for(i = 1; i <= n; i++)
            {
                if(fa[i] == i)
                    cnt1++;
                if(du[i] & 1)
                    cnt++;
            }
            if((cnt == 2||cnt == 0)&&cnt1 == 1)//欧拉回路则从cnt = 0,cnt1就是根节点个数
                printf("Full\n");
            else
                printf("Part\n");
        }
        return 0;
    }

猜你喜欢

转载自blog.csdn.net/Nothing_227/article/details/81706393
今日推荐