受歡迎的牛 Trajan縮點 樹形dp

2021-09-28 12:36:57 字數 2633 閱讀 7048

題目解析:

題目資料:100

%的資料n<=

10000

,m<=

50000;

顯然這個圖裡面會有環,而我們可以做的是:判斷這個點是否是其它點的子節點;

因此:要把這個圖轉化為樹;

用到trajan演算法;

在這道題中:可能會出現如下情況:

a-->b<

--c;||

v(箭頭)

d就是有a ,c這兩個入度為0的點;

所以要用乙個for迴圈,控制trajan演算法的進行,保證所有的點都已經更新;

for(int i=

1;i<=n;i++

)}

如果是第一次接觸trajan演算法,推薦你閱讀我的另一篇部落格,裡面有一些對於該演算法所使用變數的注釋

部落格鏈結

下面接著分析:

將圖更新為樹後,如何尋找所有點的子節點;

第一種:樹形dp的方法

第二種:直接判斷樹中,出度為0的點有幾個,如果有乙個,輸出對應的點包含幾個原始點;

有過有多個,直接輸出0;

第一種:

樹形dp如何寫,

a-->b<

--c;||

v(箭頭)

db被父節點更新時,判斷b是否已經被更新過,如果沒被更新(也就是要第一次更新)

那麼就把自身的值加上,傳遞給d的值,也就是b目前的值;

如果b已經被更新,那麼b所有的子節點也一定被更新了,這是b增加的只是父節點給它更新的值

b傳給子節點的值,也是它的父節點傳給它的值;

詳細看**。

#include

#include

#include

#include

#include

using

namespace std;

const

int num=

10010

;/*---------------------*/

struct nodee[num*5]

;int head[num]

,ip0[num]

,cnt;

mapint,

int>

,bool

>mp;

int head2[num]

,ip[num]

,op[num]

,cnt2;

/*---------------------*/

int dfn[num]

,low[num]

,ind,stack[num]

,t,f[num]

,cnt3,w[num]

,all;

bool vis[num]

;/*---------------------*/

int n,m,ans,dp[num]

;/*---------------------*/

void

int_i

(void

)void

addedge

(int u,

int v)

void

addedge2

(int u,

int v)

void

tarjan

(int u)

else

if(vis[v])}

//printf("u==%d,dfn==%d,low==%d\n",u,dfn[u],low[u]);

if(dfn[u]

==low[u]

)while

(v!=u);}

return;}

void

dfs(

int u,

int f,

int c)

else

if(dp[v]!=0

)if(dp[v]

==all) ans+

=w[v]

;//這裡要寫w[v],不能寫+1;因為可能滿足條件的乙個點,

//包含了許多點

}return;}

//第二種方法:

void

solve

(void)}

if(c==1)

else

ans=0;

return;}

intmain()

for(

int i=

1;i<=n;i++)}

for(

int i=

0;i<=cnt;i++)}

if(cnt3==1)

//說明原圖只有乙個點或只有乙個環

for(

int i=

1;i<=cnt3;i++)}

//for(int i=1;i<=cnt3;i++)

// printf("dp==%d\n",dp[i]);

//第二種方法:

//solve();

printf

("%d\n"

,ans);}

return0;

}/*3 3

1 22 1

2 34 3

1 32 3

3 4*/

B1051 受歡迎的牛 tarjan縮點

就是一道tarjan縮點的板子,之前在洛谷做過。但是我發現乙個事,就是函式裡面有一句話 void tarjan int x else if vis y if low x dfn x while x v 其中有一段 if dfn y else if vis y 但是變成 if dfn y else i...

洛谷 P2341 受歡迎的牛(tarjan縮點)

題目鏈結 思路 因為n是1e4,所以floyd求傳遞閉包肯定是不行的,二維陣列都開不了這麼大,複雜度也不對,然後就學了下tarjan縮點,因為每個強連通分量裡的每個牛肯定是互相喜歡的,所以我們要找強連通分量出度為0的那一團。1.只找到一團出度為0的強連通分量,答案就是那一團的大小。2.找到0或多團強...

洛谷P2341 受歡迎的牛 Tarjan縮點

題意 a喜歡b,b喜歡c,那麼a就喜歡c,每個人都必定喜歡自己,求問被所有人喜歡的人有多少個 輸入格式 n,m分別是人總數和喜歡關係的數目,接下來m行每行兩個數字a,b代表a喜歡b 直接套tarjan演算法縮點模板,記錄數目並最後記錄每個點出度即可即可。include define maxn 100...