I - Ant Trip (无向图欧拉回路+并查集),判断
生活随笔
收集整理的這篇文章主要介紹了
I - Ant Trip (无向图欧拉回路+并查集),判断
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
I - Ant Trip
參考博客:Ant Trip(歐拉回路+并查集)
參考:歐拉路徑問題與歐拉回路問題
?題意:給你無向圖的?N?個點和?M?條邊,保證這?M 條邊都不同且不會存在同一點的自環邊,現在問你至少要幾筆才能所有邊都畫一遍。(一筆畫的時候筆不離開紙)
思路:先并查集將無向圖的每個連通圖分開,同時將所有點的度算一遍,
原圖應是由若干個無向連通圖組成的 當這個無向連通圖只有一個點時,這是一個孤立點,不做操作,也就是只有一個點時特判 否則:計算每個無向圖的奇度點的個數(可以通過find操作,將個數存在每個圖集的代表點處,也就是find處) 如果奇度點的個數為0,表示是歐拉回路 如果奇度點的個數>=2,表示是對應的歐拉路徑(歐拉回路也是歐拉路徑) 所以: ??對歐拉路徑 :筆畫數=奇度點數 / 2 對歐拉回路:筆畫數=等于1? WA點:單點圖要特判掉,雖然它也是歐拉回路,但是無邊,對此題來說不需要安排螞蟻去 無向連通圖奇度點個數不可能為奇數 代碼: 1 ***********************************************/ 2 int in[maxn],out[maxn]; 3 int st[maxn]; 4 int V[maxn]; 5 int num[maxn]; 6 int n,m; 7 8 int find(int t) 9 { 10 while(st[t]!=t) t=st[t]; 11 return t; 12 } 13 14 void add(int a,int b) 15 { 16 int fa=find(a); 17 int fb=find(b); 18 if(fa>fb) st[fa]=fb; 19 else st[fb]=fa; 20 } 21 22 int main() 23 { 24 25 while(cin>>n>>m) 26 { 27 mem0(in); 28 mem0(V); 29 mem0(st); 30 mem0(num); 31 for(int i=1;i<=n;i++) st[i]=i; 32 for(int i=1;i<=m;i++) 33 { 34 int a,b; 35 sc2(a,b); 36 in[a]++; 37 in[b]++; 38 add(a,b); 39 } 40 int ans=0; 41 for(int i=1;i<=n;i++) 42 { 43 if(in[i]%2) V[find(i)]++;//奇數度的個數 44 num[find(i)]++; 45 } 46 for(int i=1;i<=n;i++) 47 { 48 if(st[i]==i) 49 { 50 //當是1個點的時候,特判 51 if(num[i]==1) continue;//因為一個點的圖沒有邊 52 if(V[i]>=2) ans+=(V[i]/2); 53 else ans++;//是歐拉回路 54 } 55 } 56 cout<<ans<<endl; 57 } 58 return 0; 59 } View Code?關于歐拉與哈密:
?
?
?
?
轉載于:https://www.cnblogs.com/liuyongliu/p/10321801.html
總結
以上是生活随笔為你收集整理的I - Ant Trip (无向图欧拉回路+并查集),判断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 生成洛伦兹的蝴蝶
- 下一篇: 分享PWM输入模式捕捉4路PWM波形的周