標籤:div 個數 最大的 江南 聯通 南京 fread ++ 表示
Description這裡,是美麗的南京;這裡,是秀美的進香河;這裡是安逸的老虎橋。 如果說進香河的美,美在其秀美的風光,倒不如說是美在了那愜意的南京古典小巷式生活。如果說進香河的迷人,在其淳樸的民風,倒不如說是那被曆史掩埋了的秘密吸引著人們好奇的心。 也許很多人都還記得,老虎橋監獄,北洋時期江南最大的監獄,在近一個世紀中,面對滿清、北洋、民國、新中國幾朝興衰,名稱屢次更替,滄桑盡顯其中。 現在的人們,恐怕很難相信,到底有多少驚心動魄的事情曾經就在這裡上演。 那是1948年的冬天,南京地下組織的一支小分隊決定偷襲老虎橋監獄,救出被困的數百名人員。那時的老虎橋監獄,被N層電網圍了起來,由內而外,依次編號為1,2,…,N。第1層電網接有高壓電。有M條高壓線,串連了所有電網,其中第i條高壓線串連了第ai和bi層電網,如果要破壞第i條高壓線,需要至少動用Ti位特工。面對這麼多層電網,偷襲小分隊犯愁了。至少需要破壞一層電網,否則是無法偷襲成功的。 然而,狡猾的間諜卻知道了這件事情,為了破壞偷襲計劃,敵人秘密地又增加了一條高壓線,不讓偷襲小分隊的成員發現。 為了能夠偷襲成功,不論新增的這一條秘密高壓線是串連哪兩層電網的,小分隊都必須要破壞且僅破壞一條高壓線,使得至少有一層電網不通電。注意,對於新增的高壓線,我們並不知道需要多少位特工才能成功破壞。現在的問題是,偷襲小分隊至少需要多少名特工呢? 決戰就在今夜! Input第一行有2個整數,N和M,分別表示電網層數和高壓線個數。 之後M行,每行3個整數,分別是ai, bi和Ti。 Output輸出只有一行,包含一個整數,表示最少需要動用的特工人數。 如果計劃必然失敗,則輸出 -1。 邊雙聯通分量內的邊刪了不影響聯通情況,所以先縮點,留下割邊,問題轉化為在樹上選一條路徑,使未被覆蓋的邊的最小值最大,可以直接樹形dp
#include<cstdio>#define G *++ptrconst int N=500007,inf=0x3f3f3f3f;char buf[N*60],*ptr=buf-1;int _(){ int x=0,c=G; while(c<48)c=G; while(c>47)x=x*10+c-48,c=G; return x;}bool ei[N*4];int n,m,es[N*6],enx[N*6],ev[N*6],e0[N],e1[N],ep=2,id[N],idp;void ae(int*e,int a,int b,int c){ es[ep]=b;enx[ep]=e[a];ev[ep]=c;e[a]=ep++; es[ep]=a;enx[ep]=e[b];ev[ep]=c;e[b]=ep++;}int dfn[N],low[N],tk=0;void mins(int&a,int b){if(a>b)a=b;}void maxs(int&a,int b){if(a<b)a=b;}int min(int a,int b){return a<b?a:b;}int max(int a,int b){return a>b?a:b;}void tj(int w){ dfn[w]=low[w]=++tk; for(int i=e0[w];i;i=enx[i]){ int u=es[i]; if(!u)continue; if(!dfn[u]){ es[i^1]=0; tj(u); es[i^1]=w; mins(low[w],low[u]); if(low[u]>dfn[w])ei[i>>1]=1; }else mins(low[w],dfn[u]); }}void f1(int w){ id[w]=idp; dfn[w]=0; for(int i=e0[w];i;i=enx[i]){ int u=es[i]; if(!ei[i>>1]&&dfn[u])f1(u); }}int v0[N],v02[N],v1[N],v2[N],vu[N],v,ans=0;void f2(int w,int pa){ v0[w]=v02[w]=v1[w]=v2[w]=vu[w]=inf; for(int i=e1[w];i;i=enx[i]){ int u=es[i]; if(u==pa)continue; f2(u,w); v=min(v0[u],ev[i]); v2[w]=max(min(v2[w],v),min(v1[w],v1[u])); v1[w]=max(min(v1[w],v),min(v0[w],v1[u])); if(v<=v0[w])v02[w]=v0[w],v0[w]=v; else mins(v02[w],v); }}void f3(int w,int pa){ v=min(vu[w],v2[w]); maxs(ans,v); for(int i=e1[w];i;i=enx[i]){ int u=es[i]; if(u==pa)continue; vu[u]=min(min(ev[i],vu[w]),min(v0[u],ev[i])==v0[w]?v02[w]:v0[w]); f3(u,w); }}int main(){ fread(buf,1,sizeof(buf),stdin)[buf]=0; n=_();m=_(); for(int i=0,a,b,c;i<m;++i){ a=_();b=_();c=_(); if(a==b)continue; ae(e0,a,b,c); } tj(1);for(int i=1;i<=n;++i)if(dfn[i]){ ++idp; f1(i); } for(int i=2;i<ep;i+=2)if(ei[i>>1])ae(e1,id[es[i]],id[es[i^1]],ev[i]); f2(1,0); f3(1,0); if(ans==inf)ans=-1; printf("%d",ans); return 0;}
bzoj4331: JSOI2012 越獄老虎橋