tarjan割點算法代碼實現
阿新 • • 發佈:2019-05-02
turn 代碼實現 spa 節點 i++ cin else if 標記 cpp
#include<iostream> using namespace std; int n,m,x,y; int e[9][9]; int root=1; int timex;//時間戳 int num[9],low[9],flag[9];//flag標記割點 int min(int a,int b){ if(a<b){ return a; }else{ return b; } } void dfs(int cur,int father){ int child=0; timex++; num[cur]=timex; low[cur]=timex; for(int i=0;i<n;i++){ if(e[cur][i]==1&&num[i]==0){//是否聯通,是否被訪問過 child++; dfs(i,cur); low[cur]=min(low[cur],low[i]); if(cur!=root&&low[i]>=num[cur]){ flag[cur]=1; }else if(cur==root&&child>=2){ flag[cur]=1; } } if(e[cur][i]==1&&num[i]==1){//聯通,但被訪問過 if(i!=father){//i不是當前節點的父親,就是說i是當前節點的祖先 low[cur]=min(low[cur],num[i]); } } } } int main(){ cin>>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ e[i][j]=0; } } for(int j=0;j<m;j++){ cin>>x>>y; e[x][y]=1; e[y][x]=1; } dfs(1,root); for(int i=0;i<n;i++){ if(flag[i]==1){ cout<<i<<" "; } } return 0; }
tarjan割點算法代碼實現