• CodeForces 789D 欧拉路径计数,思维


    CodeForces 789D

    题意:n个点m条边的无向图,求经过其中m-2条边两次,剩下2条边一次的方案数有几种,如果剩下两条边的集合一样算同一种。

    tags: 选出两条边,其它m-2条边假想复制成两条,这样就是要求欧拉路径是否存在,即奇点个数是否为0或2。 所以该怎么选这两条边呢?   

    先把边分为自环边和普通边。

    1.选取两条不相邻普通边,图中存在4个奇点,不满足欧拉路径条件;

    2.选取两条相邻普通边,图中存在2个奇点,满足欧拉路径条件;

    3.选取一条普通边一条自环,图中存在2个奇点,满足欧拉路径条件;

    4.选取两条自环,图中存在0个奇点,满足欧拉路径条件;

    当然如果m条边覆盖的集合不是连通的,答案为0。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a;i<=b;i++)
    #define per(i,b,a) for (int i=b;i>=a;i--)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    #define MP make_pair
    #define PB push_back
    #define fi  first
    #define se  second
    typedef long long ll;
    const int N = 2000005;
    
    ll  n, m, fa[N], ind[N], numa, numb;
    bool vis[N];
    int Find(int x) { return x==fa[x] ? x : (fa[x]=Find(fa[x])); }
    void Unite(int u, int v)
    {
        int fau=Find(u), fav=Find(v);
        if(fau!=fav) fa[fau]=fav;
    }
    int main()
    {
        scanf("%lld %lld", &n, &m);
        rep(i,1,n) fa[i]=i;
        int u, v;
        rep(i,1,m)
        {
            scanf("%d %d", &u, &v);
            vis[u]=vis[v]=1;
            if(u!=v) ++ind[v], ++ind[u];
            Unite(u, v);
            if(u!=v) ++numa;
            else ++numb;
        }
        int cnt=0;
        rep(i,1,n) if(vis[i]==1 && fa[i]==i)  ++cnt;
        if(m==1) printf("0
    ");
        else if(cnt!=1) printf("0
    ");
        else {
            ll  ans=0;
            rep(i,1,n) if(vis[i]==1 && ind[i]>1) ans+= (ind[i]*(ind[i]-1)/2);
            ans+= (numa*numb);
            ans+= (numb*(numb-1)/2);
            printf("%lld
    ", ans);
        }
    
        return 0;
    }
  • 相关阅读:
    SAS学习笔记5 字符截取语句(index、compress、substr、scan函数)
    SAS学习笔记4 基本运算语句(lag、retain、_n_函数)
    SAS学习笔记3 输入输出格式(format、informat函数)
    SAS学习笔记2 基础函数应用
    特性与反射
    WebApi 接口返回值类型详解 ( 转 )
    C# 数据类型转化为byte数组
    关于.Net中Process和ProcessStartInfor的使用
    C#双缓冲解释
    如何获取到一个form中的所有子控件?
  • 原文地址:https://www.cnblogs.com/sbfhy/p/7137696.html
Copyright © 2020-2023  润新知