不能最大生成樹+最大的一條邊,但是為什麼呢?
if(fx!=fy) 如果兩棵樹上不是都有回環,那麼可以合併,fx掛在fy上,如果其中乙個有環,fy標記為有環
if(fx==fy&&!(circle[x]+circle[y]) 如果兩棵樹上都沒有回環,那麼x和y還能合併,環數變為1
#include#includeusing namespace std;
const int n=1e5+10;
int fa[n];
int circle[n];
int n,m;
int ans=0;
struct edge
}a[100010];
void init(int n)
}int find(int x)
int main()
else if(fx==fy)
}if(cnt==n) break; //因為有乙個環了,所以總共是n條邊
}printf("%d\n",sum);
}return 0;
}
HDU 3367最大生成樹
不能直接跑最大生成樹,但是還可以存在乙個環,這樣一下就用krusal判環來寫了就是比普通的最大生成樹多了合併判斷。於網路 include include include using namespace std typedef struct nn node node edg 100005 int fa...
hdu 3367 偽森林,not 最大生成樹
感覺題意很扭曲。不是求最大生成樹!給乙個圖,求pseudoforest偽森林,要求每個連通分量最多可以有乙個環。求能構成的最大值。錯誤寫法,求出最大生成樹 最大的邊 正確寫法 在求最大生成樹的思路的基礎上每次判斷一下環的問題 6 7 0 1 9 0 2 6 1 2 8 3 4 5 4 5 5 3 5...
hdu3367最大偽森林(並查集)
題目要求乙個連通圖的最大偽森林,偽森林是乙個最多有乙個迴路的圖。我們只要用kruskal最大生成樹的策略就可以,給根節點表上記號表明這棵樹有沒有負環。其實也有一些貪心的思想。如下 1 include2 using namespace std 3 typedef unsigned int ui 4 t...