1. 程式人生 > >python tarjan演算法實現

python tarjan演算法實現

#coding:utf-8
#tarjan 演算法
#https://blog.csdn.net/jeryjeryjery/article/details/52829142?locationNum=4&fps=1
#求任意頂點開始的聯通圖 有且僅存在一個 且dfn[u] == low[u]
from collections import OrderedDict
matric = [[0,1,1,0,0,0],[0,0,0,1,0,0],[0,0,0,1,1,0],[1,0,0,0,0,1],[0,0,0,0,0,1],[0,0,0,0,0,0]]
dfn = OrderedDict()
low = OrderedDict()
flag = dict()
count = 0
n = 6 
num = 0
class Stack(object):
    def __init__(self):
        self.items = list()
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def clear(self):
        del self.items[:]
    def empty(self):
        return self.size() == 0
    def size(self):
        return len(self.items)
    def top(self):
        return self.items[self.size() - 1]

s = Stack()
def tarjan(u):
    global s,num,n,count,flag,stack,dfn,low,matric
    count = count + 1
    dfn[u] = low[u] = count
    s.push(u)
    flag[u] = True
    #print("visiting {0} ...".format(str(u + 1)))
    for i in range(n):
        if matric[u][i] == 0:
            continue
        if flag.get(i, False) is True:
            if (dfn[i] < low[u]):
                low[u] = dfn[i]
        else:
            tarjan(i)
            low[u] = min(low[u], low[i])
    if (dfn[u] == low[u] and s.empty() is False):
       print("********連通圖********")
       m = s.pop()
       flag[m] = False
       print(m + 1)
       while m != u and s.empty() is False:
           num = num + 1
           m = s.pop()
           flag[m] = False
           print(m+1)
       print("*********************")  

if __name__  == "__main__":
    pass
    tarjan(3)
    print("連通圖數量...")
    print(num)

tarjan 演算法 求任意頂點開始的 連通圖 (相對於一般演算法 每個頂點 只進行一次正向深度優先搜尋)

相關推薦

python tarjan演算法實現

#coding:utf-8 #tarjan 演算法 #https://blog.csdn.net/jeryjeryjery/article/details/52829142?locationNum=4&fps=1 #求任意頂點開始的聯通圖 有且僅存在一個 且dfn[u

python常用演算法實現

排序是計算機語言需要實現的基本演算法之一,有序的資料結構會帶來效率上的極大提升。 1.插入排序 插入排序預設當前被插入的序列是有序的,新元素插入到應該插入的位置,使得新序列仍然有序。 def insertion_sort(old_list): n=len(old_list) k

python hash演算法實現

#!/usr/bin/env python # -*- coding:utf-8 -*- class HashTable: def __init__(self, size):

poj 2186(tarjan 演算法實現

剛開始沒怎麼想,就直接tarjan,然後處理縮點的時候出錯了。。。。貢獻了2次WA。。。。冷靜下來  好好想了想  感覺應該是這樣的: 找到縮點以後,計算一下縮點的出度,在這裡,不能有兩個以上的縮點的出度為0,因為      compute the number of c

Python】曲線簡化演算法實現

Overview 曲線簡化演算法通常應用於運動捕捉資料的關鍵幀提取,在此基礎上還演化出了更多的演算法 本文對基本的曲線簡化演算法進行了程式碼實現,以關鍵幀個數或線性重建誤差作為迭代終止條件 其中,計算點i到直線n1-n2的距離公式如下[1]: 更多演算法及分析可參考[2]

決策樹之ID3演算法實現(python) [置頂] 怒寫一個digit classification(不斷更新中)

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

演算法實現:歸併(合併)排序(C/C++、Python

合併排序的關鍵步驟在於合併步驟中的合併兩個已排序子序列。為做合併,引入一個輔助過程MERGE(A, p, q, r), 其中A是一個數組,p、q和r是下標,滿足p小於等於q小於r。該過程假設子陣列A[p...q] 和A[q+1...r]都已排好序,並將它們合併成一個已排好序的子陣列代替當前子陣列

演算法實現:插入排序(C/C++、Python

虛擬碼: INSERTION-SORT for j <- 2 to length[A] key <- A[j] Insert A[j]into the sorted sequence A[l...j-1]. i <- j - 1 wh

【機器學習演算法實現】主成分分析 PCA ——基於python+numpy

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

【機器學習演算法實現】logistic迴歸 基於Python和Numpy函式庫

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

【機器學習演算法實現】kNN演算法 手寫識別——基於Python和NumPy函式庫

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

Python基於K-均值、RLS演算法實現RBF神經網路(神經網路與機器學習 第五章 計算機實驗)

1、生成資料集 class moon_data_class(object): def __init__(self,N,d,r,w): self.N=N self.w=w self.d=d self.r=r

正向最大匹配演算法實現python實現

1.python 版本:python 3.6.4 2.思路: s1.匯入分詞詞典,儲存為字典形式dic,匯入停用詞詞典stop_words,儲存為字典形式,需要分詞的文字檔案cutTest.txt,儲存為字串chars s2.遍歷分詞詞典,找出最長的詞,長度為max_chars s3

DBSCAN演算法實現---Python

生活不易啊,公司考核,初步寫出來了,腦闊疼。。。 思路:   設定閾值與半徑;   計算點之間的距離(歐式距離實現);   區分核心點、邊界點與離群點;   將每個點的領域作為一個類(即將密度可達的點歸為一個簇);   找出每個獨立的領域;   對最後的聚類進行標記;   視覺化。 &nbs

python資料分析與挖掘之貝葉斯演算法演算法實現

程式碼中有詳細的註釋 訓練檔案: Txt檔案中為0,1矩陣,將圖片轉換為0,1矩陣見上一篇部落格方法 import numpy import operator from os import listdir class Bayes: def __init__(self):

python資料建模與KNN演算法實現手寫體數字識別

      資料建模指的是對現實世界各類資料的抽象組織,建立一一個適合的模型對資料進行處理。在資料分析與挖掘中,我們通常需要根據一-些資料建 立起特定的模型,然後處理。模型的建立需要依賴於演算法, - -般,常見的演算法有分類、聚類、關聯、

使用Python從頭開始實現基線機器學習演算法

                  使用Python從頭開始實現基線機器學習演算法        在預測建模問題上建立基線效能非常重要。基線為您稍後評估的更高階方法提

Python Numpy 100題實驗(九):幾種標準化演算法實現

單獨把這幾道題目拿出來,歸為一類吧,都是標準化演算法。 本講的主要內容: Z-Score標準化演算法 Min-Max標準化演算法 應用L2正規化標準化資料 使用Z-Score標準化演算法對資料進行標準化處理 首先給出Z-Score標準化公式: Z=X−mea

演算法實現:選擇排序(C/C++、Python

虛擬碼: SELECTION-SORT{A) n <- length[A] for i<-1 to n-1 do j <-FIND-MIN(A,i,n) A[j]&l

演算法實現:合併排序(C/C++、Python

合併排序的關鍵步驟在於合併步驟中的合併兩個已排序子序列。為做合併,引入一個輔助過程MERGE(A, p, q, r), 其中A是一個數組,p、q和r是下標,滿足p小於等於q小於r。該過程假設子陣列A[p...q] 和A[q+1...r]都已排好序,並將它們合併成一個已排好序的