------------------------------poj1386和poj2513是同乙個型別
poj1836:
視為求有向的尤拉通路(並非尤拉迴路)
判別方法
①所有的點入度==出度或者②只有有兩個入度減出度為1和-1的兩個節點(終點,開點)其他點入度==出度則存在尤拉通路
由於這題需要用完全部的單詞,所以要判斷圖是否全部連通,即用並查集即可判斷有多少個集合。
**:
/*
將乙個單詞的首位和末位視為乙個頂點,則中間的單詞則是一條邊.
那麼只需要記錄下首位的出度和末位的入度,資料量就變成了26個.
用used記錄下這個字母是否出現
*/#include #include #include #include #include #include #include #include #include#include #include using namespace std;
typedef long long ll;
bool used[26];
int f[26];
int indegree[26];
int outdegree[26];
inline void read(int &m)//int
while(ch>='0'&&ch<='9')
m=x*f;
}int find(int x)
bool concect()
int main()
int one=0;//出度比入度多一
int done=0;//入度比出度多一
bool flag=1;
for(int i=0;i<26;i++)
if(indegree[i]-outdegree[i]==1&&++done>=2) //檢查相差幾個單位
if(outdegree[i]-indegree[i]==1&&++one>=2)
}if(one!=done) flag=0;
if(!concect()) flag=0; //是否連通
if(flag)
printf("ordering is possible.\n");
else
printf("the door cannot be opened.\n");
} return 0;
}
poj2513
視為求無向圖尤拉通路
無向圖存在尤拉路的充要條件為:
① 圖是連通的;
② 所有節點的度為偶數,或者有且只有兩個度為奇數的節點。
由於這道題不能用map對映string的id,所以只能用字典樹來對映
當然由於還要用完全部的火柴,也需要判斷是否全部連通--並查集
#include #include #include #include #include #include #include #include #include#include #include using namespace std;
typedef long long ll;
const int maxn=510010;
int f[maxn];
int degree[maxn];
int color=0;
struct trie
};int insert_get(trie *root,char *ch)
p=p->next[ch[i]-'a'];
} if(!p->flag)
return p->id;
}int find(int x)
int connect()
int main()
{ trie *root=new trie;
for(int i=0;i
poj1386 尤拉迴路)
題目鏈結 解題思路 把每個單詞當成是一條有向邊。把首字母和尾字母當成是節點,如果該字母是乙個單詞的首字母,該字母的入度就加一,如果是尾字母,該字母的出度就加一。然後判斷是否形成尤拉迴路即可。尤拉路徑判斷條件 首先該圖必須是連通圖。對於無向圖,所有頂點的讀都為偶數,對於有向圖,要麼所有頂點的入度等於出...
POJ 1386 判斷尤拉迴路
題意 要開啟一扇門,n個單詞是密碼,n個單詞中,如果乙個單詞的首字母和前乙個單詞的尾字母相同,並且每個單詞都能這麼連起來且只用一次,則門可以開啟,否則不能開啟,現給出單詞,判斷門是否可以開。有向圖尤拉通路充要條件 d為有向圖,d的基圖連通,並且所有頂點的出度與入度都相等 或者除兩個頂點外,其餘頂點的...
POJ 1386 尤拉迴路,尤拉通路,變相DNF
此題用了我一天,說明我的基礎知府還是不夠紮實 考點 尤拉迴路和尤拉通路,加變相dnf 前提 要是連通圖 用dnf,每一步兩頭搜 尤拉迴路,要求圖的每乙個點的出度和入度一樣,尤拉通路,要求圖的起點的出度比入度大1,終點的出度比入度少於1 include include include using na...