題目解析:
題目資料: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...