1. 程式人生 > >強聯通tarjan的一些黑科技以及隨想

強聯通tarjan的一些黑科技以及隨想

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的一些黑科技以及隨想