HDU-1269 Tarjan求强连通分量,模板题
生活随笔
收集整理的這篇文章主要介紹了
HDU-1269 Tarjan求强连通分量,模板题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
HDU 1269
題意:n個點m條單向邊,問任意兩個點是否連通。
總結:參考大神博客碼的,有些地方還是不太明白。 而且這題還可以雙向dfs做,有時間再做一下。
// HDU-1269 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 1e4+10, M = 1e5+10;int n, m, sum, top, tot; //sum為強連通分量數,top為棧指針 int head[N], Stack[N], instack[N]; //Stack[]為模擬棧,instack[]表示是否在棧中 int dfn[N], low[N], Belong[N]; //dfn[]為深搜次序數組,Low[u]為u結點或者u的子樹結點所能追溯到的最早棧中結點的次序號,這兩個數組是關鍵。Belong[]表示每個結點所對應的強連通分量標號數組,這個題里用不到 struct Edge { int to, next; } edge[M];void Init() {sum=top=tot=0;mes(head, -1);mes(dfn, 0); } void Addedge(int u, int v) {edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++; } void Tarjan(int u) //Tarjan算法求有向圖的強連通分量 {dfn[u]=low[u]=++tot; //時間戳,不太明白Stack[top++]=u, instack[u]=1;for(int e=head[u]; e!=-1; e=edge[e].next) {int v=edge[e].to;if(dfn[v]==0) {Tarjan(v);if(low[u]>low[v]) low[u]=low[v]; //更新結點v所能到達的最小次數層,這里不太明白 }else if(instack[v] && low[u]>dfn[v]) {low[u]=dfn[v];}}if(dfn[u]==low[u]) { //如果節點v是強連通分量的根 sum++;while(top!=0) {int t=Stack[--top];instack[t]=0;Belong[t]=sum;if(t==u) break; //直到將v從棧中退出,這不太明白 }} } void Solve() {FF(i,1,n) if(dfn[i]==0)Tarjan(i); } int main() {while(scanf("%d%d", &n, &m)!=EOF && (n||m)) {Init();FF(i,1,m) {int u, v;scanf("%d%d", &u, &v);Addedge(u, v);}Solve();if(sum==1) puts("Yes");else puts("No");}return 0; } Tarjan求強連通轉載于:https://www.cnblogs.com/sbfhy/p/6349736.html
總結
以上是生活随笔為你收集整理的HDU-1269 Tarjan求强连通分量,模板题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7 安装 Node.js
- 下一篇: 异常记录与处理-Cannot find