水题。
但是需要注意题目中的隐含条件,如图所示,要求是连通图,因此需要先判断是否是连通图,否则其中一个样例出错。
#include<cstdio>
#include<vector>
#include<queue>
#define maxn 550
using namespace std;
vector<int> g[maxn];
int gfs(int first) {
int visit[maxn] = {0};
int c = 0;
queue<int> q;
q.push(first);
visit[first]++;
c++;
while(!q.empty()) {
int t = q.front();
q.pop();
for (int i = 0; i < g[t].size(); i++) {
if (visit[g[t][i]] == 0) {
q.push(g[t][i]);
visit[g[t][i]]++;
c++;
}
}
}
return c;
}
int main() {
int N, M;
int a, b;
scanf("%d %d", &N, &M);
for (int i = 0; i < M; i++) {
scanf("%d %d", &a, &b);
g[a].push_back(b);
g[b].push_back(a);
}
int count_odd = 0;
int num = gfs(1);
for (int i = 1; i < N; i++) {
if (g[i].size() % 2 == 1) count_odd++;
printf("%d ", g[i].size());
}
printf("%d\n", g[N].size());
if (g[N].size() % 2 == 1) count_odd++;
if (num != N) printf("Non-Eulerian\n");
else if (count_odd == 0) printf("Eulerian\n");
else if (count_odd == 2) printf("Semi-Eulerian\n");
else printf("Non-Eulerian\n");
return 0;
}