Weird journey CodeForces - 788B (路径计数)

大意:$n$结点$m$条边无向图, 满足

$(1)$经过$m-2$条边$2$次

$(2)$经过其余$2$条边$1$次

的路径为好路径, 求所有好路径数

相当于边加倍后再删除两条边, 求欧拉路条数

首先欧拉路径存在等价于奇数度点不超过2个

所以删除自环边一定成立,若删除两条非自环边, 则两边必须有公共点

特判下不连通输出0即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)

using namespace std;
typedef long long ll;

const int N = 1e6+10;
int deg[N], vis[N], s[N], n, m, k, cnt;

int find(int x) {return s[x]?s[x]=find(s[x]):x;}

int main() {
    scanf("%d%d", &n, &m);
    REP(i,1,m) {
        int u, v;
        scanf("%d%d", &u, &v);
        vis[u]=vis[v]=1;
        if (u==v) ++k;
        else ++deg[u],++deg[v];
        if ((u=find(u))!=(v=find(v))) s[u]=v,++cnt;
    }
    REP(i,1,n) if (!vis[i]) ++cnt;
    if (cnt<n-1) return puts("0"),0;
    ll ans = (ll)k*(m-k)+(ll)k*(k-1)/2;
    REP(i,1,n) ans += (ll)deg[i]*(deg[i]-1)/2;
    printf("%lld\n", ans);
}

猜你喜欢

转载自www.cnblogs.com/uid001/p/10341055.html