这题非常简单,题目稍微复杂一些,但是实际上要做的工作很少也很直白。
注意,在根据偶数度节点和奇数度节点判断是否为欧拉图之前,一定要用并查集检验一下是否为连通图。相信这题通过率只有0.2多可能就是因为很多小伙伴一开始遗漏了这一点。It has been proven that connected graphs with all vertices of even degree have an Eulerian circuit。题目中也给提醒啦~
#include<stdio.h>
int root[501];
int findRoot(int x)
{
if (root[x] == -1)
{
return x;
}
else
{
int tmp = findRoot(root[x]);
root[x] = tmp;
return tmp;
}
}
int main()
{
int N, M;
scanf("%d%d", &N, &M);
int degree[501];
for (int i = 1; i <= N; i++)
{
root[i] = -1;
degree[i] = 0;
}
for (int i = 0; i < M; i++)
{
int start, end;
scanf("%d%d", &start, &end);
degree[start]++;
degree[end]++;
int rootStart = findRoot(start);
int rootEnd = findRoot(end);
if (rootStart != rootEnd)
{
root[rootStart] = rootEnd;
}
}
int evenDegree = 0, oddDegree = 0, rootNode = 0;
for (int i = 1; i <= N; i++)
{
if (i == N)
{
printf("%d\n", degree[i]);
}
else
{
printf("%d ", degree[i]);
}
if (degree[i] % 2 == 0)
{
evenDegree++;
}
else
{
oddDegree++;
}
if (root[i] == -1)
{
rootNode++;
}
}
if (rootNode > 1)
{
printf("Non-Eulerian\n");
}
else if (oddDegree == 0)
{
printf("Eulerian\n");
}
else if(oddDegree ==2)
{
printf("Semi-Eulerian\n");
}
else
{
printf("Non-Eulerian\n");
}
return 0;
}