【题解】1126 Eulerian Path (25分)⭐⭐⭐ 【欧拉路径】
题意:
给出一个N个点M条边的无向图,判断他是否为欧拉图,半欧拉图或者非欧拉图
题解:
存在欧拉回路为欧拉图,存在欧拉路径但是没有回路为半欧拉图,其余为半欧拉图。
由于是无向图,判断欧拉路径即为所有点度数均为偶数,欧拉回路即恰好只有2个点为奇数。
题目很友好,这些提示都给出了。但是要注意,存在欧拉路径的先决条件是图联通,不难想到,如果图都不连通,如果存在欧拉路径呢?
判断图联通有并查集和DFS两种方法,这里都可以使用
经验小结:
#include<bits/stdc++.h>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef long long LL;
const int INF = 1 << 30;
const int MAXN = 1010;
int N, M, G[MAXN][MAXN], d[MAXN];
int cnt = 0; //连通点的数量
bool vis[MAXN];
void Dfs(int u){
vis[u] = true;
++cnt;
for(int v = 1; v <= N; ++v)
if(!vis[v] && G[u][v])
Dfs(v);
}
int main() {
ios::sync_with_stdio(false);
int u, v;
cin >> N >> M;
while(M--){
cin >> u >> v;
G[u][v] = G[v][u] = true;
++d[u], ++d[v];
}
int odd = 0;
for(int i = 1; i <= N; ++i){
if(d[i]%2 == 1)
++odd;
if(i == N)
cout << d[i] << endl;
else
cout << d[i] << ' ';
}
Dfs(1);
if(cnt==N && odd == 2)
cout << "Semi-Eulerian\n";
else if(cnt==N && odd == 0)
cout << "Eulerian\n";
else
cout << "Non-Eulerian\n";
return 0;
}