摘要:最近是不适合写代码么?忘记初始化wa到死<_=_=_>。唔--最近在学习图论,从基础搞起,先搞了拓扑排序和欧拉(回)路。

Part 0. 拓扑排序

  ==挖坑==

Part 1. 欧拉(回)路

先判连通性

欧拉回路:

  1.  有向图:每个顶点入度等于出度
  2.  无向图:每个顶点度数都为偶数

欧拉路:

  1.  有向图:每个顶点入度等于出度,或者,一个顶点入度比出度大一,一个顶点入度比出度小一(起点),其余顶点入度等于出度
  2.  无向图:每个顶点度数都为偶数,或者,只有两个顶点度数为奇数

HDU 3018 Ant Trip  注意hint

  哇~我要贴错误代码啦~~说不定还能坑一下自己~_~

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <map>
 8 using namespace std ;
 9 #define rep(i,n) for (int i = 1 ; i <= n ; ++ i)
10 #define lson (i<<1)
11 #define rson (i<<1|1)
12 const int maxn = 100010 ;
13 vector<int> G[maxn] ;
14 int N , R , du[maxn] , cnt , fa[maxn] , num ;
15 bool vis[maxn] ;
16 
17 void dfs(int rt)
18 {
19     if (vis[rt]) return ;
20     num ++ ;
21     cnt += (du[rt]&1) ;
22     vis[rt] = true ;
23     int v ;
24     for (int i = 0 ; i < G[rt].size() ; ++ i) {
25         v = G[rt][i] ;
26         if (v != fa[rt]) {
27             fa[v] = rt ;
28             dfs(v) ;
29         }
30     }
31 }
32 
33 int main()
34 {
35     int u , v ;
36     while (scanf("%d%d",&N,&R) == 2) {
37         memset(vis,false,sizeof(vis)) ;
38         memset(fa,-1,sizeof(fa)) ;
39         rep(i,N) G[i].clear() ;
40         rep(i,R) {
41             scanf("%d%d",&u,&v) ;
42             du[u] ++ , du[v] ++ ;
43             G[u].push_back(v) ;
44             G[v].push_back(u) ;
45         }
46         int ans = 0 ;
47         rep(i,N) {
48             if (!vis[i]) {
49                 fa[i] = -1 ;
50                 cnt = num = 0 ;
51                 dfs(i) ;
52                 if (num == 1) continue ;
53                 if (cnt == 0) ans ++ ;
54                 else ans += (cnt/2) ;
55             }
56         }
57         printf("%d\n",ans) ;
58     }
59     return 0 ;
60 }
haha

 

 路径什么的待补~~~~~

 

 

 

 

 

==end==