hdoj 1269迷宮城(Kosarajuアルゴリズム、Tarjanアルゴリズム、Gabowアルゴリズム)
2070 ワード
図の強連通解を求めます.
->Ksarajuアルゴリズム
1.原図Gを深さ優先で巡回し、各点の出発時間を記録してスタックに入れる.
2.スタックトップ要素を選択し、反図GTを巡回し、遍歴可能な点を削除し、これらの点は強い連結成分を構成する.
3.もし頂点が削除されていないなら、サイクルステップ2、さもなければアルゴリズムは終了します.
1.アクセスされていないポイントvを探して、アルゴリズムがなければ終了します.
2.初期化dfn[v]とlow[v]
vの全隣接頂点u:
①訪問したことがないので、手順2に戻りながらlow[v]を維持する.
②訪問したが、削除されず、low[v]を維持する.
low[v]==dfn[v]の場合、対応する強い連結成分が出力されます.
->Ksarajuアルゴリズム
1.原図Gを深さ優先で巡回し、各点の出発時間を記録してスタックに入れる.
2.スタックトップ要素を選択し、反図GTを巡回し、遍歴可能な点を削除し、これらの点は強い連結成分を構成する.
3.もし頂点が削除されていないなら、サイクルステップ2、さもなければアルゴリズムは終了します.
#include
using namespace std;
int n,m,s;
int stak[10010],top;
vector edge[10010],edge_T[10010]; //
bool vis[10010]; //
void DFS_O(int v)
{
vis[v] = true;
for(int i=0; i0)
{
s = stak[--top];
if(!vis[s])
{
DFS_T(s);
++cnt;// +1
}
}
return cnt;
}
int main()
{
int a,b;
while(scanf("%d%d",&n,&m))
{
if(n==0&&n==0)
break;
for(int i=1;i<=n;++i)
{
edge[i].clear();
edge_T[i].clear();
}
for(int i=0;i
->Tarjanアルゴリズム1.アクセスされていないポイントvを探して、アルゴリズムがなければ終了します.
2.初期化dfn[v]とlow[v]
vの全隣接頂点u:
①訪問したことがないので、手順2に戻りながらlow[v]を維持する.
②訪問したが、削除されず、low[v]を維持する.
low[v]==dfn[v]の場合、対応する強い連結成分が出力されます.
#include
using namespace std;
#define ll long long
#define M 10010
int n,m;
vector edge[M];
int cnt;//
int top;
int Index;
int dfn[M],low[M];// dfn[v] v low[v] v u low[v] low[u]
int stak[M],Belong[M];//Belong[]
bool Instak[M];
void Init()
{
cnt = top = Index = 0;
for(int i=1;i<=n;i++)
low[i] = dfn[i] = 0;
}
void Tarjan(int u)
{
stak[top++] = u;
Instak[u] = 1;
low[u] = dfn[u] = ++Index;
for(int i=0;i