zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    数学笔记目录
    机器学习笔记目录
    物理学笔记目录
    二阶递推公式的通项公式
    分析Analysis 笔记
    从傅里叶变换到小波变换
    电动力学 期末复习
    电动力学 期中复习
    热学 期中复习
    理论力学第一章 Lagrange方程
  • 原文地址:https://www.cnblogs.com/ldudxy/p/12515360.html
Copyright © 2011-2022 走看看