感觉是存在不在图内的数据。
即需要对连通块进行遍历,错误代码如下:
#include<iostream>
#include<vector>
#include<map>
using namespace std;
const int maxn = 510;
int n, m, ans = 0;
vector<int> G[maxn];
map<int, int> mp;
int main() {
cin >> n >> m;
for(int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
for(int i = 1; i <= n; i++) {
mp[i] = G[i].size();
if(i != 1) cout << " ";
cout << mp[i];
if(mp[i] % 2 != 0) ans ++;
}
cout << endl;
if(ans == 2) cout << "Semi-Eulerian";
else if(ans == 0) cout << "Eulerian";
else cout << "Non-Eulerian";
return 0;
}
AC代码
#include<iostream>
#include<vector>
#include<map>
using namespace std;
const int maxn = 510;
int n, m, ans = 0, cnt = 0;
vector<int> G[maxn];
map<int, int> mp;
bool vis[maxn] = {false};
void DFS(int index) {
vis[index] = true;
cnt++;
for(int i = 0; i < G[index].size(); i++)
if(vis[G[index][i]] == false) DFS(G[index][i]);
}
int main() {
cin >> n >> m;
for(int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
for(int i = 1; i <= n; i++) {
mp[i] = G[i].size();
if(i != 1) cout << " ";
cout << mp[i];
if(mp[i] % 2 != 0) ans ++;
}
cout << endl;
DFS(1); // 遍历图,确定是否是连通图
if(ans == 2 && cnt == n) cout << "Semi-Eulerian";
else if(ans == 0 && cnt == n) cout << "Eulerian";
else cout << "Non-Eulerian";
return 0;
}