首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

POJ 1386:單詞鏈與有向圖歐拉路徑

     編輯:關於C語言

問題建模

給定一組單詞,若單詞 A 尾字母 = 單詞 B 首字母,則 A→B 可連接。問能否將所有單詞排成一條鏈(每詞用一次)。

若以單詞為頂點,邊表示可連接,則是哈密頓路徑(NP-hard)。
改以26 個字母為頂點,每個單詞為一條有向邊(首字母→尾字母)。問題轉化為:有向圖中是否存在歐拉路徑/回路。

有向圖歐拉定理

類型條件
歐拉回路連通 + 所有頂點 入度 = 出度
歐拉路徑連通 + 恰有 1 個頂點 出度 = 入度 + 1(起點),1 個頂點 入度 = 出度 + 1(終點),其餘入度=出度

算法流程

  1. 統計每字母 In[26]、Out[26]。
  2. 用并查集維護連通性:每個單詞連接首尾字母。
  3. 檢查所有出現過的字母是否在同一連通分量。
  4. 統計入出度差為 ±1 的頂點數,驗證上述條件。

關鍵代碼片段

UnionSet set(26);
int In[26]={0}, Out[26]={0};
bool vis[26]={false};

for (int i=0; i

複雜度

  • 時間 O(N × α(26)) ≈ O(N),N 為單詞數。
  • 空間 O(1)(固定 26 字母)。

避坑指南

  • 單詞可能重複 → 多條平行邊,不影響入出度統計。
  • 只出現一次的字母也要納入連通性判斷。
  • 并查集路徑壓縮 + 按秩合併確保極快。

將「單詞接龍」轉化為「字母圖歐拉路徑」,是圖論建模的經典範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved