【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]<<"\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]<<"\n"; 45 cout<<"Semi-Eulerian"; 46 } 47 else{ 48 for(int i=1;i<n;++i) 49 cout<<deg[i]<<" "; 50 cout<<deg[n]<<"\n"; 51 cout<<"Non-Eulerian"; 52 } 53 return 0; 54 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)