tarjan系列各種連通分量總結

2021-06-23 01:59:03 字數 3564 閱讀 3076

關於有向圖強連通分量的資料,我覺得最好的便是byvoid大牛的部落格:

還有關於無向圖的雙聯通分量,橋,割點之類的了解一下概念就可以根據推出來的,就再推薦一篇部落格:

另外還有一些我自己關於ssc的拙見:

其實tarjan的作用主要就是縮點,其他的還是依靠圖論的知識來解決的

還是多做題,在題目中領會吧

【hdu 1269】迷宮城堡

求整個圖是否是乙個強連通分量

模板題,只需要縮點之後看是否只剩下乙個點就行了

#include#include#include#include#define mem(a,b,c) memset(a,b,sizeof(a[0])*(c+2));

using namespace std;

const int sizen=10005;

const int sizem=100005;

int dfn[sizen],sscn[sizen],low[sizen];

int head[sizen],sz;

int dfs_time,ssc_cnt;

struct edge;

edge e[sizem];

void addedge(int u,int v)

void init(int n)

stacks;

void tarjan(int u)

else if(dfn[v]&&!sscn[v])

}if(dfn[u]==low[u])

}}int main()

;struct eedge;

edge e[sizem];

eedge ee[sizem];

int dfn[sizen],sscn[sizen];

int low[sizen],head[sizen];

int in[sizen],out[sizen];

int sz,dfs_time,ssc_cnt;

void addedge(int u,int v)

void init(int n)

stacks;

void tarjan(int u)

else if(dfn[v]&&!sscn[v])

}if(dfn[u]==low[u])while(x!=u);

}}void rebuild(int n,int m);

edge e[sizem];

int head[sizen],sz;

int low[sizen],sscn[sizen];

int dfn[sizen],in[sizen],out[sizen];

int dfs_time,ssc_cnt;

void addedge(int u,int v)

void init(int n)

stacks;

void tarjan(int u)

else if(dfn[v]&&!sscn[v])

}if(dfn[u]==low[u])while(x!=u);

}}void solve(int n,int m);

edge e[sizem];

int dfs_time,ssc_cnt,sz;

int head[sizen],in[sizen];

int dfn[sizen],low[sizen],sscn[sizen];

int val[sizen],val_sscn[sizen];

bool vis[sizen];

void init(int n)

void addedge(int u,int v)

stacks;

void tarjan(int u)

else if(dfn[v]&&!sscn[v])

}if(dfn[u]==low[u])while(x!=u);

}}void rebuild(int n,int m);

edge e[sizem];

int dfs_time,ssc_cnt,sz,txt=1;

int head[sizen],in[sizen];

int low[sizen],dfn[sizen],sscn[sizen];

int val[sizen],ans[sizen],fans[sizen];

int vis[sizen];

int max;

setset;

void init(int n)

void addedge(int u,int v)

stacks;

void tarjan(int u)

else if(dfn[v]&&!sscn[v])

}if(dfn[u]==low[u])while(x!=u);

}}void rebuild(int n,int m);

edge e[sizem];

int dfs_time,ssc_cnt,sz;

int head[sizen],in[sizen];

int dfn[sizen],low[sizen],sscn[sizen];

int cost[sizen];

void init(int n)

void addedge(int u,int v,int c)

stacks;

void tarjan(int u)

else if(dfn[v]&&!sscn[v])

}if(dfn[u]==low[u])while(x!=u);

}}void rebuild(int n,int m);

edge e[sizem];

int dfs_time,ssc_cnt,sz;

int head[sizen];

int dfn[sizen],low[sizen],sscn[sizen];

int mat[sizen];

bool vis[sizen];

vectorg[sizen];

void init(int n)

void addedge(int u,int v)

stacks;

void tarjan(int u)

else if(dfn[v]&&!sscn[v])

}if(dfn[u]==low[u])while(x!=u);

}}void rebuild(int n,int m);

edge e[sizem];

int dfs_time,sz;

int head[sizen];

int low[sizen],dfn[sizen];

int val[sizen];

bool ins[sizen],vis[sizen];

int sum,fans[sizen],ans;

int cnt;

void init(int n)

void addedge(int u,int v)

int dfs(int u,int fa)

if(!dfn[v]){

int tans=dfs(v,u);

fans[u]+=tans;

low[u]=min(low[u],low[v]);

if(dfn[u]

強連通分量 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

點雙連通分量 在無向連通圖中,如果刪除該圖的任何乙個結點都不能改變該圖的連通性,則該圖為雙連通的無向圖。乙個連通的無向圖是雙連通的,當且僅當它沒有關鍵點.強連通分量 在有向圖g中,如果兩個頂點vi,vj間 vi vj 有一條從vi到vj的有向 路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強...

強連通分量 tarjan

洛谷 p2812 校園網路 洛谷 p3387 縮點 include include include include include using namespace std struct arrbot 1100000 d 1100000 int head 20000 h 20000 stack 200...