題目:
題解:
原理:1.如果有兩個點祖先節點相同,那麼就可以構成乙個環,長度為兩個點到祖先節點長度之和+1。
2.新加入的一條邊的兩個端點在並查集中同祖先,則一定成環 。
注意:圖中不一定有乙個環,即不一定是乙個連通圖,可能有好幾個連通分量。
#includeusing namespace std;
int n,f,i,k,cnt=0,ans=0x3f3f3f3f;//重要初始化
int fa[200005];
inline int find(int x,int &cnt)//找爹函式改進版
解法二:帶權路徑並查集
解法三:
原理:環中元素的入度等於出度。
#includeusing namespace std;
#define n 200005
#define inf 200005
int to[n],indegree[n];//記錄入度
bool visit[n];
int n;
void delzero()
} if(flag) return;//沒有廢邊可以刪除了
else delzero();//進行下一輪刪除
}int ans=inf;//重要初始化
void search(int start,int now,int step)//設定返回條件
visit[now]=1;//標記
search(start,to[now],step+1); //利用遞迴遍歷環
最小生成樹的一種解法(並查集)
使用 並查集 的kruskal演算法 struct edge 為方便排序,用結構體來儲存邊的關係 struct edge e 10 比m大1即可 int n,m int f 7 sum 0,count 0 並查集所用變數,f陣列比n大1即可 void quicksort int left,int r...
poj 1182(並查集的邊權向量關係)
食物鏈 time limit 1000ms memory limit 10000k total submissions 44880 accepted 13083 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n...
食物鏈(並查集)的兩種解法
include define max n 50000 define max k 100000 int par 3 max n ran 3 max n void init int n int find int x else void unite int x,int y else bool same i...