【PAT甲级】1126 Eulerian Path (25分)

题意:

输入两个正整数N(<=500)和M,分别表示点和边的数量。接着输入M行每行包括两个点,表示之间有一条无向边。输出每个点的度数以及这张图是欧拉回路还是半欧拉回路(存在欧拉路径)还是非欧拉图。

trick:

不判断这张图是否为一张联通图会在测试点3答案错误。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int deg[507];
 5 vector<int>edg[507];
 6 int vis[507];
 7 int num;
 8 void dfs(int x){
 9     vis[x]=1;
10     ++num;
11     for(auto it:edg[x])
12         if(!vis[it])
13             dfs(it);
14     return ;
15 }
16 int main(){
17     ios::sync_with_stdio(false);
18     cin.tie(NULL);
19     cout.tie(NULL);
20     int n,m;
21     cin>>n>>m;
22     for(int i=1;i<=m;++i){
23         int u,v;
24         cin>>u>>v;
25         ++deg[u];
26         ++deg[v];
27         edg[u].emplace_back(v);
28         edg[v].emplace_back(u);
29     }
30     int cnt=0;
31     for(int i=1;i<=n;++i)
32         if(deg[i]&1)
33             ++cnt;
34     dfs(1);
35     if(num==n&&cnt==0){
36         for(int i=1;i<n;++i)
37             cout<<deg[i]<<" ";
38         cout<<deg[n]<<"
";
39         cout<<"Eulerian";
40     }
41     else if(num==n&&cnt==2){
42         for(int i=1;i<n;++i)
43             cout<<deg[i]<<" ";
44         cout<<deg[n]<<"
";
45         cout<<"Semi-Eulerian";
46     }
47     else{
48         for(int i=1;i<n;++i)
49             cout<<deg[i]<<" ";
50         cout<<deg[n]<<"
";
51         cout<<"Non-Eulerian";
52     }
53     return 0;
54 }
原文地址:https://www.cnblogs.com/ldudxy/p/12515360.html