Java
测试点6超时
import java.io.*;
public class Main {
    static final int N = 510;
    static int n, m;
    static boolean[][] g = new boolean[N][N];  // 邻接矩阵
    static boolean[] st = new boolean[N];      // 访问标记
    static int[] deg = new int[N];            // 度数数组
    // DFS遍历计算连通分量大小
    static int dfs(int u) {
        st[u] = true;
        int res = 1;
        for (int i = 1; i <= n; i++) {
            if (!st[i] && g[u][i]) {
                res += dfs(i);
            }
        }
        return res;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 读取顶点数和边数
        String[] inputs = br.readLine().split(" ");
        n = Integer.parseInt(inputs[0]);
        m = Integer.parseInt(inputs[1]);
        // 读取边并构建邻接矩阵
        for (int i = 0; i < m; i++) {
            inputs = br.readLine().split(" ");
            int a = Integer.parseInt(inputs[0]);
            int b = Integer.parseInt(inputs[1]);
            g[a][b] = g[b][a] = true;
            deg[a]++;
            deg[b]++;
        }
        // 输出每个顶点的度数
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            if (i > 1) {
                sb.append(" ");
            }
            sb.append(deg[i]);
        }
        System.out.println(sb);
        // 判断图的类型
        int num = dfs(1);
        if (num < n) {
            System.out.println("Non-Eulerian");
        } else {
            int cnt = 0;
            for (int i = 1; i <= n; i++) {
                if (deg[i] % 2 == 1) {
                    cnt++;
                }
            }
            if (cnt == 0) {
                System.out.println("Eulerian");
            } else if (cnt == 2) {
                System.out.println("Semi-Eulerian");
            } else {
                System.out.println("Non-Eulerian");
            }
        }
        br.close();
    }
}C++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 510;
int n, m;
bool g[N][N], st[N];    // [1, n]
int deg[N];
int dfs(int u) {
    st[u] = true;
    int res = 1;
    for (int i = 1; i <= n; ++i)
        if (!st[i] && g[u][i])
            res += dfs(i);
    return res;
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i) {
        int a, b;
        scanf("%d%d", &a, &b);
        g[a][b] = g[b][a] = true;
        deg[a]++;
        deg[b]++;
    }
    for (int i = 1; i <= n; ++i) {
        if (i > 1) printf(" ");
        printf("%d", deg[i]);
    }
    printf("\n");
    int num = dfs(1);
    if (num < n) printf("Non-Eulerian\n");
    else {
        int cnt = 0;
        for (int i = 1; i <= n; ++i)
            if (deg[i] % 2 == 1) cnt++;
        if (cnt == 0) printf("Eulerian\n");
        else if (cnt == 2) printf("Semi-Eulerian\n");
        else printf("Non-Eulerian\n");
    }
    return 0;
}