POJ 1386 判斷尤拉迴路

2021-07-14 20:04:43 字數 1615 閱讀 3706

題意:要開啟一扇門,n個單詞是密碼,n個單詞中,如果乙個單詞的首字母和前乙個單詞的尾字母相同,並且每個單詞都能這麼連起來且只用一次,則門可以開啟,否則不能開啟,現給出單詞,判斷門是否可以開。

有向圖尤拉通路充要條件:d為有向圖,d的基圖連通,並且所有頂點的出度與入度都相等;或者除兩個頂點外,其餘頂點的出度與入度都相等,而這兩個頂點中乙個頂點的出度與入度之差為1,另乙個頂點的出度與入度之差為-1。

有向圖尤拉迴路充要條件:當d的所有頂點的出、入度都相等時,d中存在有向尤拉迴路。

思路:乙個單詞關鍵是首字母和尾字母,可以把首字母和尾字母看成頂點,這個單詞看成這兩個頂點間的邊,這麼建圖,於是原題就變成了找這個圖中是否存在尤拉通路或者尤拉迴路。建完圖之後只需要根據定理判斷每個頂點的出度、入度以及圖的連通性即可。

**:判斷有多少個連通分量可以用並查集或者dfs。。我就都寫了一遍

(其實是在給某人找錯,就順便寫了一遍)

這是用並查集寫的,寫得不太好看。。(凑活看吧)

#include 

#include

using

namespace

std;

char a[1050],vis[26],vis[26],f[26];

int cases,n,out[26],in[26],tot=0,temp,ans,ansx,ansy,len;

int find(int x)

int main()

for(int i=0;i<=25;i++)

if(vis[i]&&!vis[find(i)])

vis[find(i)]++,ans++;

if(ans>1)

for(int i=0;i<=25;i++)

if(ansx==ansy&&(ansx==1||ansx==0)&&!temp)puts("ordering is possible.");

else

puts("the door cannot be opened.");}}

dfs:

#include 

#include

#include

using

namespace

std;

char a[1005];

bool vis[26],vis[26],flag;

int cases,tot,v[200010],next[200010],first[2010],n,in[26],out[26];

int cnt1,cnt2,cnt3;

void add(int x,int y)

void dfs(int x)

int main()

for(int i=0;i<26;i++)

if(cnt3==2&&cnt1==1&&cnt2==1)

for(int i=0;i<26;i++)

}else

if(!cnt3)

else

if(flag)puts("ordering is possible.");

else

puts("the door cannot be opened.");}}

poj1386 尤拉迴路)

題目鏈結 解題思路 把每個單詞當成是一條有向邊。把首字母和尾字母當成是節點,如果該字母是乙個單詞的首字母,該字母的入度就加一,如果是尾字母,該字母的出度就加一。然後判斷是否形成尤拉迴路即可。尤拉路徑判斷條件 首先該圖必須是連通圖。對於無向圖,所有頂點的讀都為偶數,對於有向圖,要麼所有頂點的入度等於出...

POJ 1386 尤拉迴路,尤拉通路,變相DNF

此題用了我一天,說明我的基礎知府還是不夠紮實 考點 尤拉迴路和尤拉通路,加變相dnf 前提 要是連通圖 用dnf,每一步兩頭搜 尤拉迴路,要求圖的每乙個點的出度和入度一樣,尤拉通路,要求圖的起點的出度比入度大1,終點的出度比入度少於1 include include include using na...

poj1386 poj2513 尤拉迴路

poj1386和poj2513是同乙個型別 poj1836 視為求有向的尤拉通路 並非尤拉迴路 判別方法 所有的點入度 出度或者 只有有兩個入度減出度為1和 1的兩個節點 終點,開點 其他點入度 出度則存在尤拉通路 由於這題需要用完全部的單詞,所以要判斷圖是否全部連通,即用並查集即可判斷有多少個集合...