最小環的幾種解法(並查集 刪邊)

2021-09-11 06:54:21 字數 1509 閱讀 6711

題目:

題解:

原理: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...