有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...