關於有向圖強連通分量的資料,我覺得最好的便是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...