-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
97 lines (94 loc) · 31.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<!doctype html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><meta><title>raincity's blog</title><link rel="manifest" href="/manifest.json"><meta name="application-name" content="raincity's blog"><meta name="msapplication-TileImage" content="/img/favicon.svg"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="raincity's blog"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta property="og:type" content="blog"><meta property="og:title" content="raincity's blog"><meta property="og:url" content="https://raincity343.github.io/"><meta property="og:site_name" content="raincity's blog"><meta property="og:locale" content="zh_CN"><meta property="og:image" content="https://raincity343.github.io/img/og_image.png"><meta property="article:author" content="raincity"><meta property="twitter:card" content="summary"><meta property="twitter:image:src" content="https://raincity343.github.io/img/og_image.png"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","mainEntityOfPage":{"@type":"WebPage","@id":"https://raincity343.github.io"},"headline":"raincity's blog","image":["https://raincity343.github.io/img/og_image.png"],"author":{"@type":"Person","name":"raincity"},"publisher":{"@type":"Organization","name":"raincity's blog","logo":{"@type":"ImageObject","url":"https://raincity343.github.io/img/logo.svg"}},"description":""}</script><link rel="icon" href="/img/favicon.svg"><link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.0.0/css/all.css"><link data-pjax rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/styles/atom-one-light.css"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;600&family=Source+Code+Pro"><link data-pjax rel="stylesheet" href="/css/default.css"><style>body>.footer,body>.navbar,body>.section{opacity:0}</style><!--!--><!--!--><!--!--><!--!--><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/lightgallery.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/justifiedGallery.min.css"><!--!--><!--!--><!--!--><!--!--><style>.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#3273dc;position:fixed;z-index:2000;top:0;right:100%;width:100%;height:2px}</style><script src="https://cdn.jsdelivr.net/npm/[email protected]/pace.min.js"></script><!--!--><!--!--><!-- hexo injector head_end start --><script>
(function () {
function switchTab() {
if (!location.hash) {
return;
}
const id = '#' + CSS.escape(location.hash.substring(1));
const $tabMenu = document.querySelector(`.tabs a[href="${id}"]`);
if (!$tabMenu) {
return;
}
const $tabMenuContainer = $tabMenu.parentElement.parentElement;
Array.from($tabMenuContainer.children).forEach($menu => $menu.classList.remove('is-active'));
Array.from($tabMenuContainer.querySelectorAll('a'))
.map($menu => document.getElementById($menu.getAttribute("href").substring(1)))
.forEach($content => $content.classList.add('is-hidden'));
if ($tabMenu) {
$tabMenu.parentElement.classList.add('is-active');
}
const $activeTab = document.querySelector(id);
if ($activeTab) {
$activeTab.classList.remove('is-hidden');
}
}
switchTab();
window.addEventListener('hashchange', switchTab, false);
})();
</script><!-- hexo injector head_end end --><meta name="generator" content="Hexo 7.3.0"></head><body class="is-2-column"><nav class="navbar navbar-main"><div class="container navbar-container"><div class="navbar-brand justify-content-center"><a class="navbar-item navbar-logo" href="/"><img src="/img/logo.svg" alt="raincity's blog" height="28"></a></div><div class="navbar-menu"><div class="navbar-start"><a class="navbar-item is-active" href="/">Home</a><a class="navbar-item" href="/archives">Archives</a><a class="navbar-item" href="/categories">Categories</a><a class="navbar-item" href="/tags">Tags</a><a class="navbar-item" href="/about">About</a></div><div class="navbar-end"><a class="navbar-item search" title="搜索" href="javascript:;"><i class="fas fa-search"></i></a></div></div></div></nav><section class="section"><div class="container"><div class="columns"><div class="column order-2 column-main is-8-tablet is-8-desktop is-8-widescreen"><div class="card"><article class="card-content article" role="article"><div class="article-meta is-size-7 is-uppercase level is-mobile"><div class="level-left"><span class="level-item"><time dateTime="2024-11-06T02:09:17.000Z" title="2024/11/6 10:09:17">2024-11-06</time>发表</span></div></div><p class="title is-3 is-size-4-mobile"><a class="link-muted" href="/2024/11/06/eulerian-circuits/">欧拉回路</a></p><div class="content"><p>网络上关于求欧拉回路的线性算法的资料普遍缺少证明。本文将通过分析欧拉回路的性质正向推导出这一算法。</p>
<h2 id="算法流程"><a href="#算法流程" class="headerlink" title="算法流程"></a>算法流程</h2><p>基本的定义可以参考 <a target="_blank" rel="noopener" href="https://www.cnblogs.com/alex-wei/p/basic_graph_theory.html">Alex_Wei 的博客</a>,本文不再赘述。</p>
<p>算法流程部分仅推导求无向图欧拉回路的算法,求有向图欧拉回路的算法的推导过程是类似的,更改一些对应术语即可。</p>
<p>显然图中的孤立点与欧拉回路无关,本小节假设要么图中不存在孤立点,要么整张图就是一个孤立点。</p>
<p><strong>性质 1</strong>:无向图 $G$ 是欧拉图,当且仅当图 $G$ 连通,且 $\forall u \in G$,$2 \mid d(u)$。</p>
<blockquote>
<p> 证明:必要性显然,下证充分性。</p>
<p> 考虑归纳法。$|E| = 0$ 时结论显然成立。假设 $|E| < m$ 时结论成立,下证 $|E| = m$ 时结论成立。</p>
<p> 显然图中至少存在一个环(否则图将会是一棵树,树的叶子节点度数为 $1$,矛盾)。删除环上的边后图可能分裂成若干个连通块,但每个连通块中至少存在一个环上的点,并且仍然满足 $\forall u \in G$,$2 \mid d(u)$。由归纳假设,每个连通块都存在欧拉回路,用环把这些欧拉回路串起来即可得到原图的欧拉回路。</p>
</blockquote>
<p><strong>性质 2</strong>:若无向图 $G$ 是欧拉图,则 $G$ 是边双连通图。</p>
<blockquote>
<p> 证明:性质 1 的证明直接导出了这一结论。</p>
</blockquote>
<p><strong>性质 3</strong>:无向图 $G$ 是半欧拉图,当且仅当图 $G$ 连通,且 $\sum_{u \in G} [2 \nmid d(u)] = 2$。并且,设满足 $2 \nmid d(u)$ 的两个点分别为 $s, t$,则 $G$ 的欧拉迹的两个端点一定为 $s, t$。</p>
<blockquote>
<p> 证明:必要性显然,下证充分性。</p>
<p> 在 $s, t$ 之间再连一条边,则图会变成一张欧拉图。把新图的欧拉回路中 $(s, t)$ 这条边删掉即可得到原图的一条欧拉迹。</p>
</blockquote>
<p>现在考虑构造一张欧拉图的欧拉回路或一张半欧拉图的欧拉迹。考虑递归构造,定义函数 $dfs(s)$ 返回 $s$ 所在的连通块的生成子图中一条 $s \rightsquigarrow s$ 的欧拉回路或一条 $s \rightsquigarrow t$ 的欧拉迹。</p>
<p>若整张图就是一个孤立点,则可以返回一条空途径 $s$。否则任取 $s$ 的一条邻边 $(s, v)$ 并删除,有以下两种情况:</p>
<ol>
<li>图变得不连通,则 $(s, v)$ 是原图的一条割边。由性质 2,我们要求的一定是一条欧拉迹。并且,$t$ 一定在 $v$ 所在的连通块,因为假设在原图加入 $(s, t)$ 这条边则原图会变得连通。因此可以返回 $dfs(s) + dfs(v)$。</li>
<li>图仍然连通。可以返回 $s + dfs(v)$。</li>
</ol>
<p>这样我们就得到了一个 $O(m (n + m))$ 的算法,瓶颈在于判断图是否连通。</p>
<p>我们希望避免判断图是否连通,即合并两种情况。实际上这是非常简单的。可以先调用 $dfs(v)$,设结果为 $a$,再调用 $dfs(s)$,设结果为 $b$,最后返回 $b + a$。这是因为如果图不连通,则 $dfs(s)$ 和 $dfs(v)$ 的过程互不干扰,否则 $dfs(v)$ 时会把图删空,$dfs(s)$ 会直接返回 $s$。</p>
<p>这样我们就得到了一个 $O(n + m)$ 的算法,不过实现时有一些需要注意的地方:</p>
<ul>
<li>删边可以用打标记 + 当前弧优化代替。</li>
<li>$dfs$ 并不需要真的返回一条途径,只需要不断向构造的途径里 prepend 新的点。这可以通过在 $dfs$ 过程中执行 append,最后执行一次 reverse 解决。</li>
<li>不断 $dfs(s)$ 其实很蠢,这相当于枚举 $s$ 的每条出边并执行 $dfs(v)$,回溯前再 append $s$。</li>
</ul>
<p>这样就得到了我们平时实现的算法。</p>
<h2 id="参考实现"><a href="#参考实现" class="headerlink" title="参考实现"></a>参考实现</h2><p>模板题:<a target="_blank" rel="noopener" href="https://uoj.ac/problem/117">UOJ117 欧拉回路</a>。本题要求输出边的顺序,只需要把回溯前 append $s$ 这一步改成每次调用 $dfs(v)$ 之后 append $(s, v)$ 这条边即可。</p>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><bits/stdc++.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> all(x) begin(x), end(x)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> len(x) int((x).size())</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> ll = <span class="type">long</span> <span class="type">long</span>;</span><br><span class="line"><span class="keyword">using</span> db = <span class="type">long</span> <span class="type">double</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span> <<span class="keyword">typename</span> T></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">bool</span> <span class="title">ckmin</span><span class="params">(T &x, <span class="type">const</span> T &y)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> y < x <span class="built_in">and</span> (x = y, <span class="literal">true</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span> <<span class="keyword">typename</span> T></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">bool</span> <span class="title">ckmax</span><span class="params">(T &x, <span class="type">const</span> T &y)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> x < y <span class="built_in">and</span> (x = y, <span class="literal">true</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> n, m;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> undirected {</span><br><span class="line"><span class="keyword">constexpr</span> <span class="type">int</span> N = <span class="number">1e5</span> + <span class="number">5</span>, M = <span class="number">4e5</span> + <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> tot = <span class="number">1</span>, hd[N], nxt[M], to[M], d[N];</span><br><span class="line"><span class="type">bool</span> vis[M];</span><br><span class="line">vector<<span class="type">int</span>> p;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">ae</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v)</span> </span>{</span><br><span class="line"> ++d[u], ++d[v];</span><br><span class="line"> nxt[++tot] = hd[u], hd[u] = tot, to[tot] = v;</span><br><span class="line"> nxt[++tot] = hd[v], hd[v] = tot, to[tot] = u;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> u)</span> </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> &i = hd[u]; i > <span class="number">0</span>; i = nxt[i]) {</span><br><span class="line"> <span class="keyword">if</span> (vis[i / <span class="number">2</span>]) {</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> vis[i / <span class="number">2</span>] = <span class="literal">true</span>;</span><br><span class="line"> <span class="type">int</span> tmp = i % <span class="number">2</span> == <span class="number">1</span> ? -(i / <span class="number">2</span>) : i / <span class="number">2</span>;</span><br><span class="line"> <span class="built_in">dfs</span>(to[i]);</span><br><span class="line"> p.<span class="built_in">push_back</span>(tmp);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">proc</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i <= m; ++i) {</span><br><span class="line"> <span class="type">int</span> u, v;</span><br><span class="line"> cin >> u >> v;</span><br><span class="line"> <span class="built_in">ae</span>(u, v);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> s = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i <= n; ++i) {</span><br><span class="line"> <span class="keyword">if</span> (d[i] % <span class="number">2</span> == <span class="number">1</span>) {</span><br><span class="line"> cout << <span class="string">"NO\n"</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (d[i] > <span class="number">0</span>) {</span><br><span class="line"> s = i;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (s != <span class="number">0</span>) {</span><br><span class="line"> <span class="built_in">dfs</span>(s);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">len</span>(p) < m) {</span><br><span class="line"> cout << <span class="string">"NO\n"</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> cout << <span class="string">"YES\n"</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = m; --i >= <span class="number">0</span>;) {</span><br><span class="line"> cout << p[i] << <span class="string">" \n"</span>[i == <span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> directed {</span><br><span class="line"><span class="keyword">constexpr</span> <span class="type">int</span> N = <span class="number">1e5</span> + <span class="number">5</span>, M = <span class="number">2e5</span> + <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> tot, hd[N], nxt[M], to[M], inD[N], outD[N];</span><br><span class="line">vector<<span class="type">int</span>> p;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">ae</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v)</span> </span>{</span><br><span class="line"> ++inD[v], ++outD[u];</span><br><span class="line"> nxt[++tot] = hd[u], hd[u] = tot, to[tot] = v;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> u)</span> </span>{</span><br><span class="line"> <span class="type">int</span> &i = hd[u];</span><br><span class="line"> <span class="keyword">while</span> (i > <span class="number">0</span>) {</span><br><span class="line"> <span class="type">int</span> tmp = i;</span><br><span class="line"> i = nxt[i];</span><br><span class="line"> <span class="built_in">dfs</span>(to[tmp]);</span><br><span class="line"> p.<span class="built_in">push_back</span>(tmp);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">proc</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i <= m; ++i) {</span><br><span class="line"> <span class="type">int</span> u, v;</span><br><span class="line"> cin >> u >> v;</span><br><span class="line"> <span class="built_in">ae</span>(u, v);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> s = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i <= n; ++i) {</span><br><span class="line"> <span class="keyword">if</span> (inD[i] != outD[i]) {</span><br><span class="line"> cout << <span class="string">"NO\n"</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (inD[i] > <span class="number">0</span>) {</span><br><span class="line"> s = i;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (s != <span class="number">0</span>) {</span><br><span class="line"> <span class="built_in">dfs</span>(s);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">len</span>(p) < m) {</span><br><span class="line"> cout << <span class="string">"NO\n"</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> cout << <span class="string">"YES\n"</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = m; --i >= <span class="number">0</span>;) {</span><br><span class="line"> cout << p[i] << <span class="string">" \n"</span>[i == <span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"> cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-><span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"> cin.<span class="built_in">exceptions</span>(cin.failbit);</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> tc;</span><br><span class="line"> cin >> tc >> n >> m;</span><br><span class="line"> <span class="keyword">if</span> (tc == <span class="number">1</span>) {</span><br><span class="line"> undirected::<span class="built_in">proc</span>();</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> directed::<span class="built_in">proc</span>();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</div></article></div></div><div class="column column-left is-4-tablet is-4-desktop is-4-widescreen order-1 is-sticky"><div class="card widget" data-type="profile"><div class="card-content"><nav class="level"><div class="level-item has-text-centered flex-shrink-1"><div><figure class="image is-128x128 mx-auto mb-2"><img class="avatar" src="/img/avatar.png" alt="raincity"></figure><p class="title is-size-4 is-block" style="line-height:inherit;">raincity</p></div></div></nav><nav class="level is-mobile"><div class="level-item has-text-centered is-marginless"><div><p class="heading">文章</p><a href="/archives"><p class="title">1</p></a></div></div><div class="level-item has-text-centered is-marginless"><div><p class="heading">分类</p><a href="/categories"><p class="title">0</p></a></div></div><div class="level-item has-text-centered is-marginless"><div><p class="heading">标签</p><a href="/tags"><p class="title">2</p></a></div></div></nav></div></div><!--!--><!--!--><div class="card widget" data-type="recent-posts"><div class="card-content"><h3 class="menu-label">最新文章</h3><article class="media"><div class="media-content"><p class="date"><time dateTime="2024-11-06T02:09:17.000Z">2024-11-06</time></p><p class="title"><a href="/2024/11/06/eulerian-circuits/">欧拉回路</a></p></div></article></div></div><div class="card widget" data-type="archives"><div class="card-content"><div class="menu"><h3 class="menu-label">归档</h3><ul class="menu-list"><li><a class="level is-mobile" href="/archives/2024/11/"><span class="level-start"><span class="level-item">十一月 2024</span></span><span class="level-end"><span class="level-item tag">1</span></span></a></li></ul></div></div></div><div class="card widget" data-type="tags"><div class="card-content"><div class="menu"><h3 class="menu-label">标签</h3><div class="field is-grouped is-grouped-multiline"><div class="control"><a class="tags has-addons" href="/tags/%E5%9B%BE%E8%AE%BA/"><span class="tag">图论</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/%E6%AC%A7%E6%8B%89%E5%9B%9E%E8%B7%AF/"><span class="tag">欧拉回路</span><span class="tag">1</span></a></div></div></div></div></div></div><!--!--></div></div></section><footer class="footer"><div class="container"><div class="level"><div class="level-start"><a class="footer-logo is-block mb-2" href="/"><img src="/img/logo.svg" alt="raincity's blog" height="28"></a><p class="is-size-7"><span>© 2024 raincity</span> Powered by <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> & <a href="https://github.com/ppoffice/hexo-theme-icarus" target="_blank" rel="noopener">Icarus</a></p></div><div class="level-end"></div></div></div></footer><script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script><script src="https://cdn.jsdelivr.net/npm/[email protected]/min/moment-with-locales.min.js"></script><script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/clipboard.min.js" defer></script><script>moment.locale("zh-cn");</script><script>var IcarusThemeSettings = {
article: {
highlight: {
clipboard: true,
fold: 'unfolded'
}
}
};</script><script data-pjax src="/js/column.js"></script><script src="/js/animation.js"></script><a id="back-to-top" title="回到顶端" href="javascript:;"><i class="fas fa-chevron-up"></i></a><script data-pjax src="/js/back_to_top.js" defer></script><!--!--><!--!--><!--!--><script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/lightgallery.min.js" defer></script><script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/jquery.justifiedGallery.min.js" defer></script><script>window.addEventListener("load", () => {
if (typeof $.fn.lightGallery === 'function') {
$('.article').lightGallery({ selector: '.gallery-item' });
}
if (typeof $.fn.justifiedGallery === 'function') {
if ($('.justified-gallery > p > .gallery-item').length) {
$('.justified-gallery > p > .gallery-item').unwrap();
}
$('.justified-gallery').justifiedGallery();
}
});</script><!--!--><!--!--><script type="text/javascript" id="MathJax-script" async data-pjax>MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']]
},
svg: {
fontCache: 'global'
},
chtml: {
matchFontHeight: false
}
};</script><script data-pjax src="https://cdn.jsdelivr.net/npm/[email protected]/es5/tex-mml-chtml.js"></script><script src="https://cdn.jsdelivr.net/npm/[email protected]/pjax.min.js"></script><script src="/js/pjax.js"></script><!--!--><!--!--><!--!--><script data-pjax src="/js/main.js" defer></script><div class="searchbox"><div class="searchbox-container"><div class="searchbox-header"><div class="searchbox-input-container"><input class="searchbox-input" type="text" placeholder="想要查找什么..."></div><a class="searchbox-close" href="javascript:;">×</a></div><div class="searchbox-body"></div></div></div><script src="/js/insight.js" defer></script><script>document.addEventListener('DOMContentLoaded', function () {
loadInsight({"contentUrl":"/content.json"}, {"hint":"想要查找什么...","untitled":"(无标题)","posts":"文章","pages":"页面","categories":"分类","tags":"标签"});
});</script></body></html>