程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 並查集練習---poj 1182 食物鏈

並查集練習---poj 1182 食物鏈

編輯:C++入門知識

經典的並查集題目。

主要是節點之間的關系的維護。

首先看路徑壓縮部分:


[cpp] 
int find(int x) 

    if (fa[x]==x) return x; 
    int t=fa[x]; 
    fa[x]=find(fa[x]); 
    r[x]=(r[x]+r[t])%3; 
    return fa[x]; 

這裡要注意保存原來的父節點。
再看如何合並:


[cpp] 
fx=find(x);fy=find(y); 
if (fx!=fy) 

    fa[fy]=fx; 
    c--; 
    r[fy]=(r[x]-r[y]-c+6)%3; 

自己可以枚舉一些情況找找規律。至於為什麼加6,是為了確保為正(由於-c,所以不能只加3)
最後是判斷是否為真:


[cpp]
if (c==1) ans+=r[x]!=r[y]; 
else ans+=(r[x]-r[y]+3)%3!=1; 
這樣這到題就解決了。

 

 

作者:ascii991

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved