bzoj3322 最大生成樹 LCA

2022-05-27 19:54:14 字數 1577 閱讀 6744

題目大意:給個無向圖,每條邊有個限制,每個點最多能**和賣出一定**;然後按順序走過n個點,求每個賣出**的點最多能賣出多少**

一開始有點懵,想著怎麼再圖上做這個問題,後來知道要先建一棵最大生成樹

然後就好做了,做的時候**全都拿,不必考慮第乙個條件,因為就算花不完也能在之前某個地方少買一點**

然後沒個詢問找前後兩個點lca,求路徑上的最小邊的限制,這樣就可以求出賣出多少**了

最後要譴責一下非常腦殘的資料,有個資料點是兩條鏈,dfs時會爆棧= =,wa了我兩天十幾次

話說出資料時不應該這樣戲弄別人,非常浪費時間和精力又沒有意義

一定要手寫棧!!

1 #include2 #include

3 #include4

#define ll long long

5#define inf 21474836470000

6using

namespace

std;

7const

int maxn = 100010;8

struct

nodee[maxn*2],e[maxn*2

];12

int n,m,q,trade[maxn],fa[maxn][21],fa[maxn],dep[maxn],head[maxn],tot,logn,order[maxn],scc[maxn],bel,st[maxn*10

];13 ll pre[maxn][21

];14

15void insert(int u, int

v, ll c)

1819

bool

cmp(node a, node b)

2223

int find(int

x)26

27void dfs(int u, int

f)41}42

}4344 ll lca(int u, int

v)53 ret=min(ret,pre[u][0

]);54 u=fa[u][0

];55}56

if (u==v) return

ret;

57for (int i=logn; i>=0; i--)

58if (fa[u][i]!=fa[v][i])

63 ret=min(ret,min(pre[v][0],pre[u][0

]));

64return

ret;65}

6667

intmain()92}

93 fa[1][0]=0

;94 dfs(1,0

);95 ll now=0;96

if (trade[order[1]]<0) puts("

0"); else now=trade[order[1

]];97

for (int i=2; i<=n; i++)else

111}

112//

printf("%lld\n", now);

113}

114return0;

115 }

最大生成樹

problem a 古老的羊皮卷 time limit 3 sec memory limit 128 mb description 奇奇,乙個響亮的名字在acm界.如今奇奇已經腰纏萬貫,飛黃騰達,日子過的是無比的滋潤.是什麼使他到了如此的地位?如果你要這麼問,奇奇會不假思索的告訴你 acm 是acm...

最大生成樹

include define pp make pair using namespace std typedef long long ll const int maxn 1e6 30 const int n 260000 const ll mod 1e9 7 const int inf 0x3f3f3...

最大生成樹

最大生成樹演算法和最小生成樹演算法幾乎一樣,只需要我們把最小生成樹演算法進行一點點改變即可。當你用krushal演算法求最小生成樹的時候,每一次選取的邊都是最小的邊,然後再去判斷這條邊是否可以加入最小生成樹 那麼當你每一次選擇的邊是最大的邊,然後再去判斷這條邊是否可以加入,那麼這就是最大生成樹的求取...