用邻接矩阵写了一下,不过看到别人写的觉得可能还是邻接表好一些
如果是测试点3过不去,那应该是此图不连通没有判断。
二刷用邻接表写了一下,不过发现这道题理解很重要
Eulerian:是连通图且所有节点的度都是偶数;
Semi-Eulerian:是连通图且有且只有两个点的度是奇数,其余都是偶数;
Non-Eulerian:此图不连通
第二遍写的时候理解出现了偏差,所以记录一下,不过感觉我怎么读都还是读不到题目说了这一层意思,感觉这个维基百科的句号句的位置十分诡异
(邻接矩阵)
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxv=510;
int g[maxv][maxv];
bool vis[maxv];
int n,m;
int cnt=0;
int num[maxv]={0};
void dfs(int s){
vis[s]=true;
for(int i=1;i<=n;i++){
if(vis[i]==false&&g[s][i]!=0){
dfs(i);
}
}
}
void tradfs(){
for(int i=1;i<=n;i++){
if(vis[i]==false){
dfs(i);
cnt++;
}
}
}
int main(){
memset(g,0,sizeof(g));
memset(vis,false,sizeof(vis));
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int id1,id2;
scanf("%d %d",&id1,&id2);
g[id1][id2]=1;
g[id2][id1]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]==1){
num[i]++;
}
}
}
int semi=0,dou=0;
for(int i=1;i<=n;i++){
if(num[i]%2!=0){
semi++;
}else{
dou++;
}
}
tradfs();
for(int i=1;i<=n;i++){
printf("%d",num[i]);
if(i!=n){
printf(" ");
}else{
printf("\n");
}
}
if(cnt!=1){
printf("Non-Eulerian");
}else{
if(dou==n){
printf("Eulerian");
}else if(semi==2){
printf("Semi-Eulerian");
}else{
printf("Non-Eulerian");
}
}
return 0;
}
(邻接表)
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int maxv=510;
int n,m;
vector<int> g[maxv];
bool vis[maxv];
int degree[maxv]={0};
void dfs(int s){
vis[s]=true;
for(int i=0;i<g[s].size();i++){
if(vis[g[s][i]]==false){
dfs(g[s][i]);
}
}
}
int cnt=0;
void dfstravel(){
for(int i=1;i<=n;i++){
if(vis[i]==false){
dfs(i);
cnt++;
}
}
}
int main(){
cin>>n>>m;
memset(vis,false,sizeof(vis));
for(int i=0;i<m;i++){
int id1,id2;
cin>>id1>>id2;
g[id1].push_back(id2);
g[id2].push_back(id1);
}
bool iseven=true;
int numofodd=0;
for(int i=1;i<=n;i++){
degree[i]+=g[i].size();
for(int j=0;j<g[i].size();j++){
degree[g[i][j]]++;
}
}
for(int i=1;i<=n;i++){
if(i!=1){
printf(" ");
}
printf("%d",degree[i]/2);
if(degree[i]/2%2!=0){
iseven=false;
numofodd++;
}
}
printf("\n");
dfstravel();
if(iseven&&cnt==1){
printf("Eulerian");
}else if(iseven==false&&cnt==1&&numofodd==2){
printf("Semi-Eulerian");
}else{
printf("Non-Eulerian");
}
return 0;
}