強聯通分量

2022-04-10 03:17:27 字數 3199 閱讀 8977

2020 10 .31

內容來自oi-wiki和yu__xuan 的講課

強聯通分量(個人理解):

tarjan 演算法是由棧來實現的

dfn[u] ---->dfs序

low[u] ---->以u為根的子樹,最小的dfs序

那麼會出現 3 中情況:

void tarjan(int u)

else if(vis[v]==1) low[u]=min(low[u],dfn[v]);

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

}}//變數注釋在下乙個板子裡面

另一種短一點的板子

void tarjan(int u)

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

} }

#include#include#include#include#includeusing namespace std;

const int m=5e4+10;

const int n=1e4+10;

int n,m,nume,head[n];

int st[m],sn,cnt,dfn[n],low[n];

bool vis[n];

struct nodee[m<<1];

void add_edge(int from,int to)

bool falg=0;

int ans;

void tarjan(int u)

else

if(vis[v]==1)

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

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

}if(falg==1)

falg=0,ans++;

}int main()for(int i=1;i<=n;i++)

printf("%d",ans);

return 0;

}

update on 2021.1.31

修一下以前寫的部落格,以前寫的真是慘不忍睹現在也是加兩道有意思的題

間諜網路

solution:

code:

#include #include #include #include #include #include #define ll long long

using namespace std;

const int n = 1e4 + 100;

const int inf = 1e9;

int read()

struct edge e[n * n] ;

int head[n], nume;

void add_edge(int from, int to) ;

head[from] = nume;

}int st[n], sn, vis[n];

int dfn[n], low[n], cnt;

int scc,rd[n], cd[n],minn[n];

int cost[n];

int num[n];

void tir(int x)

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

int main()

int r = read();

for(int i = 1 ; i <= r ; i++)

for (int i = 1; i <= n; i++)

for(int i = 1 ; i<= n ;i++)

}for(int i = 1 ; i <= nume ; i++)

int ans = 0;

for(int i = 1 ; i <= scc ;i++)

puts("yes");

printf("%d",ans);

system("pause");

return 0;

}

搶奪計畫

solution:

#include #include #include #include #include #include #define ll long long

using namespace std;

const int n = 5e5 + 100;

const int inf = 1e9;

int read()

struct edge e[n], g[n];

int head[n], nume;

void add_edge(int from, int to) ;

head[from] = nume;

}int headg[n], numg;

void another(int from, int to) ;

headg[from] = numg;

}int st[n], sn, vis[n];

int dfn[n], low[n], cnt;

int scc, rd[n], cd[n], sum[n];

int val[n], flag[n], flag[n];

int num[n];

int n, m, s, p;

int start;

void tir(int x)

if (dfn[x] == low[x])

}}int ans, dis[n];

bool vis[n];

void spfa() }}

}}int main()

for (int i = 1; i <= n; i++)

val[i] = read();

s = read(), p = read();

for (int i = 1; i <= n; i++)

for (int i = 1; i <= p; i++)

for (int i = 1; i <= m; i++)

spfa();

for (int i = 1; i <= n; i++)

printf("%d", ans);

system("pause");

return 0;

}

強聯通分量

有向圖中 u可達 v不一定意味著v可達 u.相互可達則屬於同乙個強連通分量 strongly connected component,scc 最關鍵通用部分 強連通分量一定是圖的深搜樹的乙個子樹。1.演算法思路 基本思路 這個演算法可以說是最容易理解,最通用的演算法,其比較關鍵的部分是同時應用了原圖...

強聯通分量

include include include include include include include include using namespace std struct edge vectora 80005 b 80005 node 80005 int he 80005 int n,m,...

強聯通分量 tarjan

tarjan演算法思想 dfs節點的時候,用time記錄訪問順序,則父節點會先於子節點訪問。那麼節點u遞迴的過程中找到了父節點 先訪問的 形成乙個環路,這個環路上的所有節點就是乙個強聯通分量。low的作用是用強聯通分量上的最先訪問的節點 訪問到的父節點 得time作為整個強聯通分量所有節點的時間。並...