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作為整個強聯通分量所有節點的時間。並...