題目要求乙個連通圖的最大偽森林,偽森林是乙個最多有乙個迴路的圖。我們只要用kruskal最大生成樹的策略就可以,給根節點表上記號表明這棵樹有沒有負環。其實也有一些貪心的思想。
**如下:
1 #include2using
namespace
std;
3 typedef unsigned int
ui;4 typedef long
long
ll;5 typedef unsigned long
long
ull;
6#define pf printf
7#define mem(a,b) memset(a,b,sizeof(a))
8#define prime1 1e9+7
9#define prime2 1e9+9
10#define pi 3.14159265
11#define lson l,mid,rt<<1
12#define rson mid+1,r,rt<<1|1
13#define scand(x) scanf("%llf",&x)
14#define f(i,a,b) for(int i=a;i<=b;i++)
15#define scan(a) scanf("%d",&a)
16#define mp(a,b) make_pair((a),(b))
17#define p pair18
#define dbg(args) cout<<#args<<":"<19
#define inf 0x3f3f3f3f
20const
int maxn=1e6+10;21
intn,m,t;
22 inline int
read()
26while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'
0',ch=getchar();
27return ans*w;28}
29int
f[maxn];
30bool
mark[maxn];
31struct
nodee[maxn];
34int
ans;
35void
init()
3641
bool cmp(node& a,node&b)
4245
int find(int
x)46
50void union(int x,int y,int
w)5161}
62else
6370}71
}72intmain()
7386 sort(e+1,e+m+1
,cmp);
87 f(i,1
,m)88
91 pf("
%d\n
",ans); 92}
93 }
hdu 3367 偽森林,not 最大生成樹
感覺題意很扭曲。不是求最大生成樹!給乙個圖,求pseudoforest偽森林,要求每個連通分量最多可以有乙個環。求能構成的最大值。錯誤寫法,求出最大生成樹 最大的邊 正確寫法 在求最大生成樹的思路的基礎上每次判斷一下環的問題 6 7 0 1 9 0 2 6 1 2 8 3 4 5 4 5 5 3 5...
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...