bzoj2815 ZJOI2012 災難 支配樹

2021-08-07 03:10:41 字數 1028 閱讀 9544

沒事學習一下新演算法= =,反正也不是很難,wc講過的拖到現在真是不好意思啊。

個人感覺基本上恨少考這個東西= =

題意:給你乙個dag,對於每乙個點去掉以後有多少個點不能從入度為0的點到達。

那麼這明顯就是支配樹,只要我刪的這個點是必經點,那麼我在支配樹上的所有兒子都不能到達,那麼每個點的答案就是他在支配樹的上的size-1。

建支配樹用lca,注意只有dag才能用這個方法。

#include

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

using

namespace

std;

const

int n=1e5+5;

queue

q;int head[n],head1[n],n,next[n],go[n],val[n];

int fa[n][20],dep[n],d[n],size[n],a[n],tot;

inline

void add(int x,int y)

inline

void topsort()

}}int get_lca(int x,int y)

int main()

fo(i,1,n)

if (!d[i])add(n+1,i),d[i]++;

topsort();

fo(i,1,n+1)

fa[x][0]=y;

dep[x]=dep[y]+1;

fo(j,1,16)fa[x][j]=fa[fa[x][j-1]][j-1];

}fd(i,n+1,1)size[a[i]]++,size[fa[a[i]][0]]+=size[a[i]];

fo(i,1,n)printf("%d\n",size[i]-1);

}

BZOJ2815 拓撲排序 LCA

作為乙個dag圖,結點之間又有這麼明顯的等級之分,很容易想到的是拓撲排序。但是不管是正向的拓撲排序還是逆向的拓撲排序感覺都不是特別容易的能解決這個問題。但事實上只要知道乙個十分關鍵的點 乙個物種會滅絕的必要條件是當且僅當另乙個物種滅絕。例如樣例給的當中,小強的滅絕僅和草是否滅絕有關,和牛羊無關。因此...

bzoj2815 災難 拓撲排序 lca

按照出題人的題解 我們需要構造一顆 滅絕樹 即對於滅絕樹上的兩個點x,y,如果x為y的祖先,則x的滅亡會直接導致y的滅亡。下面進行構造 首先進行拓撲排序,然後按照排序的逆序構造,保證對於圖中的任意x 都能使x構造前,已經完成構造。然後找到在滅絕樹上面的位置,顯然在滅絕樹上的公共祖先的滅絕會導致全部滅...

BZOJ1003 ZJOI 物流運輸

物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...