1. 程式人生 > >tarjan系列演算法程式碼小結

tarjan系列演算法程式碼小結

個人使用,可能不是很詳細

強聯通分量

這裡的dfn可以寫成low

因為都是在棧中,只要保證該節點的low值不為本身即可

void tarjan(int now)
{
    dfn[now]=low[now]=++tot;
    s.push(now);
    vis[now]=1;
    for(int i=headE[now];i!=-1;i=E[i].nxt)
    {
        if(!dfn[E[i].v]) 
            tarjan(E[i].v),low[now]=min(low[now],low[E[i].v]);
        else if(vis[E[i].v]) 
            low[now]=min(low[now],dfn[E[i].v]);
    }
    if(low[now]==dfn[now])
    {
        int h;
        colornum++;
        do
        {
            h=s.top();
            color[h]=colornum;
            sum[colornum]+=money[h];
            vis[h]=0;
            s.pop();
            
        }while(h!=now);
    }
}

點雙聯通分量

條件\(low[j]>=dfn[i]\)

棧的邊界條件需要特殊判斷

void tarjan(int now,int fa)
{
    dfn[now]=low[now]=++tot;
    s.push(now);
    for(int i=head[now];i!=-1;i=edge[i].nxt)
    {
        if(!dfn[edge[i].v]&&edge[i].v!=fa)
        {
            tarjan(edge[i].v,now);
            low[now]=min(low[now],low[edge[i].v]);
            if(low[edge[i].v]>=dfn[now])
            {
                memset(in,0,sizeof(in));//哪些在雙聯通分量裡
                memset(color,0,sizeof(color));
                int h=0,cnt=0;
                do
                {
                    h=s.top();s.pop();
                    in[h]=1;
                    point[++cnt]=h;
                }while(h!=edge[i].v);//warning 
                if(cnt<=1) continue;//必須構成環 
                in[now]=1;point[++cnt]=now;
                if(MakeColor(now,1)==0)
                    for(int j=1;j<=cnt;j++)
                        ans[point[j]]=1;
            }
        }
        if(edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]);
    }
}

邊雙聯通分量

記錄一下父親節點就好

void tarjan(int now,int fa)
{
    dfn[now]=low[now]=++tot;
    s.push(now);
    vis[now]=1;
    for(int i=head[now];i!=-1;i=edge[i].nxt)
    {
        if(!dfn[edge[i].v]&&edge[i].v!=fa) 
            tarjan(edge[i].v,now),low[now]=min(low[now],low[edge[i].v]);
        if(vis[edge[i].v]&&edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]);
    }
    if(dfn[now]==low[now])
    {
        int h=0;
        colornum++;
        do
        {
            h=s.top();
            color[h]=colornum;
            s.pop();
        }while(h!=now);
    }
}

割頂

條件\(low[j]>=dfn[i]\)

int tarjan(int now,int fa)
{
    int ch=0;
    dfn[now]=low[now]=++tot;
    for(int i=head[now];i!=-1;i=edge[i].nxt)
    {
        if(!dfn[edge[i].v])
        {
            tarjan(edge[i].v,fa);
            low[now]=min(low[now],low[edge[i].v]);
            if(low[edge[i].v]>=dfn[now]&&now!=fa) cut[now]=1;
            if(now==fa) ch++; 
        }
        low[now]=min(low[now],dfn[edge[i].v]);
    }
    if(now==fa&&ch>=2) cut[now]=1;
}

割邊

條件\(low[v]>dfn[now]\)

void tarjan(int now,int fa)
{
    dfn[now]=low[now]=++tot;
    for(int i=head[now];i!=-1;i=edge[i].nxt)
    {
        if(!dfn[edge[i].v]) 
        {
            deep[edge[i].v]=deep[now]+1;
            f[edge[i].v]=now;
            tarjan(edge[i].v,now);
            low[now]=min(low[now],low[edge[i].v]);
            if(low[edge[i].v]>dfn[now])
            {
                bridge[edge[i].v]=1;
                ans++;
            }
        }   
        else if(edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]); 
    }
}

相關推薦

tarjan系列演算法程式碼小結

個人使用,可能不是很詳細 強聯通分量 這裡的dfn可以寫成low 因為都是在棧中,只要保證該節點的low值不為本身即可 void tarjan(int now) { dfn[now]=low[now]=++tot; s.push(now); vis[now]=1; for(in

整合學習值Adaboost演算法原理和程式碼小結(轉載)

在中,我們講到了整合學習按照個體學習器之間是否存在依賴關係可以分為兩類: 第一個是個體學習器之間存在強依賴關係; 另一類是個體學習器之間不存在強依賴關係。 前者的代表演算法就是提升(boosting)系列演算法。在boosting系列演算法中, Adaboost是最著名的演算法之一。Adaboost既可以

Tarjan離線演算法求LCA小結

求LCA的兩種做法不多解釋,這篇文章有詳細解釋。 以前以為轉RMQ法求LCA可以取代tarjan,實則不然,Tarjan不僅效率更高,而且可以維護一些路徑上的統計量。於是又離線Tarjan法做了一些題目。 poj 3728 The merchant 題意:有n做城市,每座

boosting系列演算法

boosting是一種整合學習演算法,由一系列基本分類器按照不同的權重組合成為一個強分類器,這些基本分類器之間有依賴關係。包括Adaboost演算法、提升樹、GBDT演算法。 一、Adaboost演算法 1、基本思想 通過兩個問題: 1)如何更新樣本權重D? 提高被弱分類器錯分樣

數獨問題的一種簡單演算法程式碼實現

五一期間無聊時想起去年考研複試有一道上機題目當時沒作出來,於是一時興起想重新拾起看看是當時太緊張,還是自己能力不足。然後發現這道題目還真稍微有些難度,相當於一道數獨問題(sudoku)的簡化版。自己想來想去也只能想到兩種演算法,一種是拿剩餘元素做全排列測試,一種是回溯法測試。最後只實現了一個全排

[作業系列]演算法第3章上機實踐報告

1.實踐題目 7-3編輯距離問題 2.問題描述 設A和B是2個字串。要用最少的字元操作將字串A轉換為字串B。這裡所說的字元操作包括 (1)刪除一個字元; (2)插入一個字元; (3)將一個字元改為另一個字元。 將字串A變換為字串B所用的最少字元運算元稱為字串A到 B的編輯距離,記

各種基本演算法實現小結(五)—— 排序演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Koa2學習系列05-程式碼分層——梳理程式碼,漸近於 MVC 分層模式

重構   在前面幾節中,我們已經實現了專案中的幾個常見操作:啟動伺服器、路由中介軟體、Get 和 Post 形式的請求處理等。現在你已經邁出了走向成功的第一步。   目前,整個示例中所有的程式碼都寫在 app.js 

銀行家演算法程式碼(純手輸入)

匆忙寫了這個演算法程式碼,沒有修正,有很多冗餘,主要是check()演算法有點價值。 流程圖不再贅述,網上很多已經很完善了。 package 銀行家演算法; public class ShowData {     void Show(int Max[][],

MD4 演算法程式碼實現

介紹 MD4是一種資訊摘要演算法,由麻省理工學院教Ronald Rivest於1990年開發完成,演算法根據輸入的數值計算128位的摘要資訊,用於檢測資訊的完整性。該演算法影響了後來其他的密碼演算法的設計,如MD5、sha-1和RIPEMD演算法。 安全性 1991年

SVM SMO演算法程式碼詳細剖析

演算法實現 一:本文要結合SVM理論部分來看即筆者另一篇https://blog.csdn.net/weixin_42001089/article/details/83276714 二:有了理論部分下面就是直接程式碼啦,本文用四部分進行介紹:最簡版的SMO,改進版platt SMO,核函式,

Spark Word2Vec演算法程式碼實現

1 import com.hankcs.hanlp.tokenizer.NLPTokenizer 2 import org.apache.hadoop.io.{LongWritable, Text} 3 import org.apache.hadoop.mapred.TextInputFormat

Bagging與隨機森林演算法原理小結

 在整合學習原理小結中,我們講到了整合學習有兩個流派,一個是boosting派系,它的特點是各個弱學習器之間有依賴關係。另一種是bagging流派,它的特點是各個弱學習器之間沒有依賴關係,可以並行擬合。本文就對整合學習中Bagging與隨機森林演算法做一個總結。     隨機森林是整合學習中可以和

CLANG技術分享系列二:程式碼風格檢查(A CLANG PLUGIN APPROACH)

轉:http://kangwang1988.github.io/tech/2016/10/31/check-code-style-using-clang-plugin.html 背景 一致的程式碼風格檢查已經是老生常談了,統一規範的程式碼風格不僅可提高程式碼的可讀性,可維護性,減少問題

一致性hash演算法程式碼實現

什麼是一致性hash 一致性雜湊演算法(Consistent Hashing Algorithm)是一種分散式演算法,常用於負載均衡。Memcached client也選擇這種演算法,解決將key-value均勻分配到眾多Memcached server上的問題。它可以取代傳統的取模操作

莫煩老師遺傳演算法程式碼筆記(+布林型索引)

在學習莫煩老師的遺傳演算法---找曲線最高點的例子的時候,讀程式碼的時候發現有個布林型索引。 參見:https://morvanzhou.github.io/tutorials/machine-learning/evolutionary-algorithm/2-01-genetic-algori

大資料推薦系統演算法程式碼全接觸(機器學習演算法+Spark實現)

大資料推薦系統演算法程式碼全接觸(機器學習演算法+Spark實現)課程出自學途無憂網 課程分享地址:https://pan.baidu.com/s/1piCNIxC2Sv0zMY0yWxY9Ug  提取碼:b10v     一、課程簡介: 推薦系統是利用電子商務網站向

八大經典演算法程式碼

1 #include <iostream> 2 #include <string.h> 3 #include <malloc.h> 4 #include <cstdio> 5 using namespace std; 6 //氣泡排

python呼叫md系列演算法破解ctf題目

  題目 某銀行客戶端以安全著稱,所有網路流量都開啟了密碼學防護機制。有一天,你抓到了區域網中的網銀登入流量。在這個流量中,密碼欄位的值為   5ef5ce92fc409703a834adabd2bc861c 根據分析,你獲得瞭如下的線索: 上

特徵選擇mRMR演算法程式碼實現及安裝下載

演算法程式碼實現連線可以直接下載解壓執行,在mac或者Linux系統下:https://github.com/csuldw/MachineLearning/tree/master/mRMR    要看懂result.out檔案結果中,有兩個關鍵字:*** MaxRel fea