怪獸繁殖(tarjan縮點)

2021-08-30 06:34:37 字數 2563 閱讀 6128

有n種不同的怪獸,標號為1到n。

每天晚上,所有的怪獸都會死去,當乙隻怪獸死去的時候,它會生出乙隻或者多隻怪獸,因此怪獸的數量從來不會減少。

已知每種怪獸死去的時候能生出哪些種類的怪獸。

一開始你只有乙隻1型別的怪獸,你想要知道最終會有多少只怪獸,對1e9+7取模

如果有無窮多隻,輸出-1

我的*****思路

用一下午做出一道題的感覺真是太舒服了。

看到此題便想到建一張有向圖,a死掉之後生出b只c,那麼就連一條a到c的權值為b的邊。如果當前有a只b種類怪獸,並且有一條邊[b,

c]=d

[b,c]=d

[b,c]=

d,那麼死後就會出現a∗d

a*da∗

d只c怪獸。

因為懶,我開始寫各種dfs,就是不想寫tarjan(手動滑稽)。然後就各種不會特判,每次的思路都被自己插掉。於是終於縮了一波點,得到了乙個dag。

首先我們來考慮輸出-1的情況。

乙個強連通分量,必須是乙個邊權只有1的簡單環,否則無限增加。證明有點不像證明,不管是邊權大於1或者乙個點連出多條邊,都明顯不行。

dag上,只有出度為0的點在縮點前有大於1個點,否則輸出-1。可以考慮下面這張圖,前面的環生產怪獸,送到後面的環裡迴圈。

好了,現在保證沒有-1出現了,只需要在dag上跑乙個非常*****的dp就可以了。

整理完了感覺思路非常簡單,但卻反覆修改思路改了一下午,有點菜。

lmoliver神仙的思路

假如是個定值,因為資料範圍只有50,那麼在50天之後,一定會達到這個定值;那麼不管在哪個環上,經過lcm

(1,2

,3,4...50

)lcm(1, 2, 3, 4 ... 50)

lcm(1,

2,3,

4...

50)天,肯定會回到原來情況。所以給鄰接矩陣跑快速冪,多用幾個mod,不然可能會被惡意卡掉。然後就a掉了???(霧)實在是太強了。

//**比較凌亂,因為經過了多次惡意魔改

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const ll mod =

1e9+7;

const

int n =55;

int n, to[n]

[n], dfn[n]

, low[n]

, idx, stk[n]

, st, cnt;

int instk[n]

, col[n]

, snum, vis[n]

, add[n]

;vector<

int> scc[n]

;ll sto[n]

[n], f[n]

;void

getedge

(int id, string s)

}void

tarjan

(int u)

if(low[u]

== dfn[u])}

}void

dfs(

int u,

int c,

int s)if(

!vis[i]

)dfs

(i, c, s)

;else

if(s != i)

else

if(s == i)}}

}ll dfs1

(int u)

return f[u];}

intmain()

memset

(dfn,0,

sizeof

(dfn));

memset

(col,0,

sizeof

(col));

idx = st = snum =0;

tarjan(1

);for(

int i =

1; i <= snum;

++ i)

memset

(sto,0,

sizeof

(sto));

for(

int i =

1; i <= n;

++ i)

for(

int j =

1; j <= n;

++ j)

if(to[i]

[j]&& col[i]

&& col[j]

)memset

(f,-1,

sizeof

(f))

; cout <<

dfs1

(col[1]

)<< endl;

return0;

}

偷偷%lmolive

Tarjan縮點 SPFA 縮點

洛谷p3387縮點 tarjan spfa求dag上單源最短路模板題 用tarjan在原圖上求scc 縮點 用縮點之後的scc建乙個有向無環圖 scc權為此scc內所有點點權和 在新建的dag上將scc權視為邊權跑spfa 求scc 1 到scc n 的最長路即為所求答案 include inclu...

Tarjan演算法 縮點

我們這一篇是在已經了解tarjan演算法的基礎之上開始寫的,如果不了解的話,請先看大牛們 關於tarjan演算法的部落格。首先我們對於乙個有向無環的圖 dag 至少新增幾條邊才能使它變為強連通圖?我們很容易根據有向無環圖的性質得到,我們計算入度為零的點數為a,出度為零的點數為b,那麼我們至少需要新增...

Tarjan 縮點 模板

縮點以後,整張圖變為dag 有向無環圖 此時運用拓撲排序 求出度入度就可以完成許多事 題目 include include include include include include define ll long long using namespace std const int maxn 1...