感覺題意很扭曲。。。
不是求最大生成樹!給乙個圖,求pseudoforest偽森林,要求每個連通分量最多可以有乙個環。求能構成的最大值。
錯誤寫法,求出最大生成樹+最大的邊
正確寫法:在求最大生成樹的思路的基礎上每次判斷一下環的問題~
6 70 1 9
0 2 6
1 2 8
3 4 5
4 5 5
3 5 4
2 4 1
這組資料如果是錯誤的方法就是34,選擇(0,1),(1,2),(0,2),(2,4),(3,4),(4,5)
正確的方法答案是37,選擇(0,1),(1,2),(0,2),(3,4),(3,5),(4,5)
view code
1 #include 2 #include3 #include 4 #include 5
using
namespace
std;
6const
int n=10010;7
intn,m;
8int
father[n];
9int
circle[n];
10struct
edgee[10*n];
13int find(int
x)17
return
father[x];18}
19int
cmp(edge e1,edge e2)
22int
kruskal()
33continue;34
}35if(circle[x]&&circle[y]) continue;36
if(circle[x]&&!circle[y])else
41 ans+=e[i].z;
42//
printf("(%d,%d) %d res=%d\n",e[i].x,e[i].y,e[i].z,ans);43}
44return
ans;45}
46int
main()
53for(i=0;i)
56 sort(e,e+m,cmp);
57 printf("
%d\n
",kruskal());58}
59return0;
60 }
hdu3367最大偽森林(並查集)
題目要求乙個連通圖的最大偽森林,偽森林是乙個最多有乙個迴路的圖。我們只要用kruskal最大生成樹的策略就可以,給根節點表上記號表明這棵樹有沒有負環。其實也有一些貪心的思想。如下 1 include2 using namespace std 3 typedef unsigned int ui 4 t...
HDU 3367最大生成樹
不能直接跑最大生成樹,但是還可以存在乙個環,這樣一下就用krusal判環來寫了就是比普通的最大生成樹多了合併判斷。於網路 include include include using namespace std typedef struct nn node node edg 100005 int fa...
hdu 3367 最大生成樹 判環
不能最大生成樹 最大的一條邊,但是為什麼呢?if fx fy 如果兩棵樹上不是都有回環,那麼可以合併,fx掛在fy上,如果其中乙個有環,fy標記為有環 if fx fy circle x circle y 如果兩棵樹上都沒有回環,那麼x和y還能合併,環數變為1 include includeusin...