強聯通tarjan的一些黑科技以及隨想
阿新 • • 發佈:2018-04-03
splay pre false color 問題 求一個 eve -s event
我很不要臉的直接安利ATP大佬的blog了(原諒我大yz風氣習慣把女生叫做大佬)
放置一些ban(突然想到某農藥)子。
int z,dfn[110000],low[110000]; int top,sta[110000];bool v[110000]; int cnt,belong[110000]; void strong_unicom(int x) { dfn[x]=low[x]++z; sta[++top]=x;v[x]=true; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if基本的強聯通(擺著也是擺著)(dfn[y]==0) { strong_unicom(y); low[x]=min(low[x],low[y]); } else { if(v[y]==true) low[x]=min(low[x],dfn[y]); } } if(dfn[x]==low[x]) { int i;cnt++; do { i=sta[top];top--; v[i]=false; belong[i]=cnt; }while(i!=x); } } //----------------function-------------------- z=top=cnt=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(v,false,sizeof(v)); for(int i=1;i<=n;i++) if(dfn[i]==0)strong_unicom(i); //------------------main-------------------
曾經大家都很糾結一個問題
low[x]=min(low[x],dfn[y]);換成low[x]=min(low[x],low[y]);
也可以AC,現在明白了,是強調割點的意義。
int z,dfn[110000],low[110000],cut[110000]; void findcut(int x) { dfn[x]=low[x]=++z; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(dfn[y]==0) { findcut(y); low[x]=min(low[x],low[y]); if(low[y]>=dfn[x])cut[x]++; } else low[x]=min(low[x],dfn[y]); } } //----------------function-------------------- z=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(cut,0,sizeof(cut)); for(int i=1;i<=n;i++) if(dfn[i]==0)findcut(i); else cut[i]++; //------------------main-------------------求一個點連向的割點個數(bzoj2730礦場搭建)
強聯通tarjan的一些黑科技以及隨想