/*************************
题意:
给一个图
如果这个图是连通的,并且:
每个点的度都是偶数,则是 Eulerian
只有2个点的度是奇数,则是Semi-Eulerian
否则是Non-Eulerian
如果非连通,那也是Non-Eulerian
************************/
/***********************
解题思路:
是否连通可以用dfs判断即可。
关键还是看懂题意
*************************/
/***********************
注意
存无向图时,一定不要遗漏双向的存储!!
*********************/
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;
#define M 600
#define INF 0x7ffffff
int degree[M];
int link[M][M];
int nodenum;
int vis[M];
void dfs(int node,int n){
vis[node] = 1;
nodenum--;
for(int i=1;i<=n;i++){
if(link[node][i] && vis[i]==0){
dfs(i,n);
}
}
}
int main(){
int n, i, m,a,b,k,j,node;
memset(degree,0,sizeof(degree));
memset(link,0,sizeof(link));
cin>>n>>m;
while(m--){
cin>>a>>b;
degree[a]++;
degree[b]++;
link[a][b] = 1;
link[b][a] = 1;
}
memset(vis,0,sizeof(vis));
nodenum = n;
dfs(1,n);
int oddn=0;
for(i = 1;i <= n;i++){
if(degree[i] % 2 == 1)
oddn++;
if(i != n)
printf("%d ",degree[i]);
else printf("%d\n",degree[i]);
}
if(nodenum > 0 ){
cout<<"Non-Eulerian"<<endl;
}else if(oddn == 0){
cout<<"Eulerian"<<endl;
}
else if(oddn == 2){
cout<<"Semi-Eulerian"<<endl;
}
else cout<<"Non-Eulerian"<<endl;
return 0;
}
PAT1126. Eulerian Path (25) 判断图是否连通,求各点的度
最新推荐文章于 2021-02-01 12:29:49 发布