hiho一下 第四十九周 欧拉路

http://hihocoder.com/contest/hiho49/problem/1

给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路。

一个无向图存在欧拉路当且仅当该图是连通的且有且只有2个点的度数是奇数,此时这两个点只能作为欧拉路径的起点和终点。

若图中没有奇数度的点,那么起点和终点一定是同一个点,这样的欧拉路叫做欧拉回路

那么首先判断图连通,然后统计度为奇数的点是否是2个,或者0个(0个就是欧拉回路)。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <vector>
 5 #include <cstring>
 6 #include <string>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <functional>
11 #include <numeric>
12 #include <sstream>
13 #include <stack>
14 #include <map>
15 #include <queue>
16 //#pragma comment(linker, "/STACK:102400000,102400000")
17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
18 
19 #define ll long long
20 #define inf 0x7f7f7f7f
21 #define lc l,m,rt<<1
22 #define rc m + 1,r,rt<<1|1
23 #define pi acos(-1.0)
24 
25 #define L(x)    (x) << 1
26 #define R(x)    (x) << 1 | 1
27 #define MID(l, r)   (l + r) >> 1
28 #define Min(x, y)   (x) < (y) ? (x) : (y)
29 #define Max(x, y)   (x) < (y) ? (y) : (x)
30 #define E(x)        (1 << (x))
31 #define iabs(x)     (x) < 0 ? -(x) : (x)
32 #define OUT(x)  printf("%I64d
", x)
33 #define lowbit(x)   (x)&(-x)
34 #define Read()  freopen("a.txt", "r", stdin)
35 #define Write() freopen("b.txt", "w", stdout);
36 #define maxn 310
37 #define maxv 10010
38 #define mod 1000000000
39 using namespace std;
40 
41 vector<int>g[maxv];
42 int vis[maxv],in[maxv];
43 int n,m;
44 
45 void dfs(int u)
46 {
47     vis[u]=1;
48     for(int i=0;i<g[u].size();i++)
49     {
50         if(!vis[g[u][i]]) dfs(g[u][i]);
51     }
52 }
53 int main()
54 {
55    // Read();
56     int u,v;
57     scanf("%d%d",&n,&m);
58     memset(in,0,sizeof(in));
59     for(int i=1;i<=m;i++)
60     {
61         scanf("%d%d",&u,&v);
62         g[u].push_back(v);
63         g[v].push_back(u);
64         in[u]++;
65         in[v]++;
66     }
67     memset(vis,0,sizeof(vis));
68     bool flag=0;
69     dfs(1);
70     int ans=0;
71     for(int i=1;i<=n;i++)
72     {
73         if(!vis[i])
74         {
75             flag=1;
76         }
77         if(in[i]%2!=0) ans++;
78     }
79     //printf("%d
",ans);
80     if(flag||(ans!=2&&ans!=0)) printf("Part
");
81     else printf("Full
");
82     return 0;
83 }
原文地址:https://www.cnblogs.com/nowandforever/p/4573670.html