#include #include #define white 0
#define gray 1
#define black 2
//cnt用於編號topo序列,cnt_group用於編號group
int cnt,cnt_group;
//頂點型別,f是算導標準演算法中的乙個屬性,這裡其實可以省略
typedef struct
vertex,*pvertex;
//圖型別,包含topo排序陣列
typedef struct
graph,*pgraph;
//根據算導中的圖22-9進行初始化
pgraph initgraph()
for(int i=0;iv_n;i++) }
g->e[0][1]=1;
g->e[1][2]=1;
g->e[1][4]=1;
g->e[1][5]=1;
g->e[2][3]=1;
g->e[2][6]=1;
g->e[3][2]=1;
g->e[3][7]=1;
g->e[4][0]=1;
g->e[4][5]=1;
g->e[5][6]=1;
g->e[6][5]=1;
g->e[6][7]=1;
g->e[7][7]=1;
return g;
}//矩陣轉置,除了取反向邊,其餘全部複製
pgraph transposegraph(pgraph x)
for(int i=0;iv_n;i++)
g->e=(int**)malloc(g->v_n*sizeof(int*));
for(int i=0;iv_n;i++)
for(int i=0;iv_n;i++) }
return g;
}void dfsvisit(pgraph g,int v)
} g->v[v]->color=black;
g->v[v]->f=cnt;
g->topoorder[cnt]=v;
cnt++;
}void dfs(pgraph g)
cnt=cnt_group=0;
for(int i=0;iv_n;i++) }
void dfsvisit2(pgraph g,int v)
} g->v[v]->color=black;
g->v[v]->f=cnt;
g->v[v]->group=cnt_group;
cnt++;
}void dfs2(pgraph g)
cnt=cnt_group=0;
for(int i=g->v_n-1;i>=0;i--) }
}void printgroup(pgraph g)
printf("\n");
}void printtopo(pgraph g)
printf("\n");
}void printe(pgraph g)
printf("\n"); }}
//分兩遍dfs,第一遍取得原圖topo序列,第二遍根據topo序列遍歷頂點,取得強連通分量
//為什麼兩遍可以取得強連通分量,請參考
void main()
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...