大意:$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); }