#1 - 2020-2-19 13:14
光速火箭
定義單向邊:若節點 i 和 k 之間相連,則其間有
i->k
k->i
兩條單向邊。現有 N 個節點和 E 條單向邊,其中N>=2且E/2>=1。
定義路徑的加法:若一條路徑
i->...->j
的尾和另一條路徑
j->...->k
的首相同,則
i->path_p->j + j->path_q->k = i->path_p->j->path_q->k

定義路徑的減法:
i->path_p->j->path_q->k - i->path_p->j = j->path_q->k

其中
i->path_p->j != -(j->reverse_path_p->i)

定義環路:從某個節點出發經過若干個節點之後回到出發節點的路徑。
定義獨立環路集:該集合中的每一條環路都無法用該集合中的其他環路線性組合而成,但圖中的任意一條環路均可由該集合中的獨立環路線性組合(其中線性組合的係數為 1,0 或-1 )而成。

易得一個獨立環路集中獨立環路的數量為 E-(N-1)。輸入節點及其連接狀況,求一個可行的獨立環路集。

輸入:
第一行為 偶數 E 和 自然數 N
接下來的 E/2 行為連接情況。均為雙向連接。
輸出:
E-(N-1)行,為一個可行的獨立環路集


Example input 1:
6 3
1 2
2 3
1 3
Example output 1:
1 2 1
2 3 2
3 1 3
1 2 3 1


Example input 2:
12 5
1 2
2 3
3 4
4 5
5 1
1 3
Example output 2:
1 2 1
2 3 2
3 4 3
4 5 4
5 1 5
1 3 1
1 2 3 1
1 3 4 5 1


兩個 example 的圖如下


我個人目前是知道先打印所有 i->j->i 的 E/2 條路徑的,但是剩下的 E/2-(N-1) 條路徑暫時還沒有頭緒。
#2 - 2020-2-19 13:23
你直接说这是个undirected graph就行了,WLOG设他是联通的并且没有duplicate edge。

任意找一个spanning tree,剩下的每条non tree edge都确定了一个cycle,你只需证明这些cycle合起来就是一个basis
#2-1 - 2020-2-19 15:54
光速火箭
這能作為 undirected graph 處理嗎?同一條邊不同方向可以認為是無關聯的兩條邊
#2-2 - 2020-2-19 16:14
[已注销]
光速火箭 说: 這能作為 undirected graph 處理嗎?同一條邊不同方向可以認為是無關聯的兩條邊
如果不把self-loop以及任何含self-loop的cycle定义为cycle的话就是这个结论,这个蛮基础的。感觉你这个版本再把所有的2-cycle也放进basis里就好了。
另外你这个靠path定义cycle也不是特别标准的语言,一般cycle就简单地定义成边的子集,运算就取symmetric difference,然后这当然是一个order=2的Abelian group所以我们可以讨论basis。你那样还有一些无聊的麻烦要处理。。
#2-3 - 2020-2-19 23:17
光速火箭
诚信肥肥 说: 如果不把self-loop以及任何含self-loop的cycle定义为cycle的话就是这个结论,这个蛮基础的。感觉你这个版本再把所有的2-cycle也放进basis里就好了。
另外你这个靠path...
這樣確實選出了 E'-(N-1) (E'=E/2) 條edge,那要如何從這些edge來構造cyclic path呢
#3 - 2020-2-19 18:29
(​​​​)
解法楼上已经说了,这里就只说一下上面算法的合理性:
1. 每一个不属于spanning tree T的边e都对应于有且仅有一个cycle。(树是最大的无环图)
2. 这样的边e都出现且仅出现在上述的cycle中,所以上述cycle无法表示为其他任何cycle的组合。
#4 - 2020-2-20 19:10
自己想了一下,程序還是寫出來了

https://github.com/yangzhaofeng/ ... b/master/genpath.cc