问你在图中有多少条路径满足有两条边经过一遍,其他的边各经过两遍。
首先如果图不连通,则不存在这样的路径。不过有一个特例,就是不联通的是孤点,并且没有自环,你也就不需要经过这条边。
那么图连通呢?
关键在于如何选择两条只经过一次的边。
分两种情况,如果其中有自环,则剩下一条边任选。因为相当于所有度都是偶度(走两边就是把所有点的度乘以2),必然有欧拉回路。
否则这两条边必须共端点,因为如果不共端点,则有四个点变成了奇度点,不可能存在欧拉回路。所以枚举每个点即可。
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<cstring>
#include<queue>
#include <cstdlib>
#include<map>
#include <set>
#include <queue>
using namespace std;
const int MAXN = 1000010;
long long INF = 0x7fffffffffffffff;
int n,m;
struct edge{
int v, next;
}e[MAXN<<1];
int head[MAXN];
int tot = 0;
void add(int u, int v) {
e[tot].v = v;
e[tot].next = head[u];
head[u] = tot++;
}
long long d[MAXN];
int vis[MAXN];
void dfs(int u) {
vis[u] = 1;
for (int k = head[u]; k != -1; k = e[k].next) {
int v = e[k].v;
if (!vis[v])
dfs(v);
}
}
int xx[MAXN];
int main()
{
memset(head, -1, sizeof(head));
memset(d, 0, sizeof(d));
memset(vis, 0, sizeof(vis));
scanf("%d%d", &n, &m);
long long t = 0;
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
if (u == v) {
t++;
xx[u] = 1;
continue;
}
d[u]++;
d[v]++;
}
for (int i = 1; i <= n; i++) {
if (d[i]) {
dfs(i);
break;
}
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
if (xx[i] != 0 || d[i]!=0) {
puts("0");
return 0;
}
}
}
long long s = 0;
s += t*(t - 1) / 2;
s += t*(m - t);
for (int i = 1; i <= n; i++) {
if (d[i] >= 2) {
s += d[i] * (d[i] - 1) / 2;
}
}
printf("%I64d\n", s);
}