JZOJ 3875 星球聯盟

2021-07-26 07:01:43 字數 2058 閱讀 2067

在遙遠的s星系中一共有n個星球,編號為1…n。其中的一些星球決定組成聯盟,以方便相互間的交流。

但是,組成聯盟的首要條件就是交通條件。初始時,在這n個星球間有m條太空隧道。每條太空隧道連線兩個星球,使得它們能夠相互到達。若兩個星球屬於同乙個聯盟,則必須存在一條環形線路經過這兩個星球,即兩個星球間存在兩條沒有公共隧道的路徑。

為了壯大聯盟的隊伍,這些星球將建設p條新的太空隧道。這p條新隧道將按順序依次建成。一條新軌道建成後,可能會使一些星球屬於同乙個聯盟。你的任務是計算出,在一條新隧道建設完畢後,判斷這條新軌道連線的兩個星球是否屬於同乙個聯盟,如果屬於同乙個聯盟就計算出這個聯盟中有多少個星球。

看到這題,第一反應就是tarjan縮環,

首先,我們必須保證初始圖的連通性必須和最後圖的連通性相同,

顯然,一條把兩張不連通的邊的答案就是0,所以先把詢問中的這種邊連上,

縮完環以後,出來的就是一顆dfs樹,在這上邊做lca,

對於乙個詢問,先求lca,要麼是連向他的父親,要麼是橫插邊,每次把新的環縮起來,邊統計答案,

每次做完以後lca並不需要維護,(讀者們可以思考一下)

複雜度:o(

nlog(n

))

#include 

#include

#include

#include

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

#define efo(i,q) for(int i=a[q];i;i=b[i][0])

using

namespace

std;

const

int n=200500,m=18;

int read(int &n)

int m,n,ans,m1,ti;

int b[4*n][3],a[n],b0=1;

int low[n],dfn[n],za[n];

int sum[n],g[n],si[n];

int z[n];

int g[n][m+1],de[n];

int root[n],sc[n][3];

int fa[n];

void link(int q,int w)

void dfsf(int q,int rt)

int gf(int q)

int tarjan(int q,int c)

else low[q]=min(low[q],tarjan(b[i][1],c+1));

}if(low[q]==dfn[q])

za[0]--;

}return low[q];

}void dfs(int q,int c,int fa)

int lca1(int q,int c)

int lca(int q,int w)

return q;

}void up(int q,int w)

}int main()

fo(i,1,n)if(i==gf(g[i]))root[++root[0]]=i;

memset(dfn,127,sizeof(dfn));

memset(low,127,sizeof(low));

fo(i,1,root[0])tarjan(root[i],1);

fo(i,1,n)

}fo(i,1,n)

else z[b[j][1]]=ti,j1=j;

}fo(i,1,root[0])dfs(root[i],1,0);

fo(j,1,m)fo(i,1,n)if(g[i][0])

g[i][j]=g[g[i][j-1]][j-1];

fo(i,1,m1)

q=gf(sc[i][0]),w=gf(sc[i][1]);

e=lca(q,w);

q=gf(q);w=gf(w),e=gf(e);

if(q==w&&q==e)

ans=0;

up(q,e);

up(w,e);

printf("%d\n",si[e]);

}return

0;}

JZOJ3875 星球聯盟 alliance

在遙遠的s星系中一共有n個星球,編號為1 n。其中的一些星球決定組成聯盟,以方便相互間的交流。但是,組成聯盟的首要條件就是交通條件。初始時,在這n個星球間有m條太空隧道。每條太空隧道連線兩個星球,使得它們能夠相互到達。若兩個星球屬於同乙個聯盟,則必須存在一條環形線路經過這兩個星球,即兩個星球間存在兩...

置頂 星球聯盟

問題描述 在遙遠的 s 星系中一共有 n 個星球,編號為 1 n。其中的一些星球決定組成聯盟,以方便相互間的交流。但是,組成聯盟的首要條件就是交通條件。初始時,在這 n 個星球間有 m 條太空 隧道。每條太空隧道連線兩個星球,使得它們能夠相互到達。若兩個星球屬於同乙個聯 盟,則必須存在一條環形線路經...

bzoj4998 星球聯盟

description 在遙遠的s星系中一共有n個星球,編號為1 n。其中的一些星球決定組成聯盟,以方便相互間的交流。但是,組成 聯盟的首要條件就是交通條件。初始時,在這n個星球間有m條太空隧道。每條太空隧道連線兩個星球,使得它們能 夠相互到達。若兩個星球屬於同乙個聯盟,則必須存在一條環形線路經過這...