這麼一看縮點用tarjan也沒必要啊,用之前那個存反向邊dfs兩次的做法就行了
縮點過程就是遍歷邊,兩側不同scc就加邊
#include//#pragma comment(linker, "/stack:1024000000,1024000000")
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define ll long long
#define pb push_back
#define for(a) for(int i=1;i<=a;i++)
#define sqr(a) (a)*(a)
const int maxn=1e6+7;
struct edgeedge[maxn<<1];
int head[maxn],edgenum;
void add(int u,int v,int d);head[u]=edgenum++;
}int dfn[maxn],low[maxn],stack[maxn],top,time;
//low[u]是u的子樹反向弧能指向的最靠近總根的祖先的時間戳
int taj;
int belong[maxn]; //連通分量所屬
bool instack[maxn];
vectorbcc[maxn];
void tarjan(int u,int fa){
dfn[u]=low[u]=++time;
stack[top++]=u;
instack[u]=1;
for(int i=head[u];~i;i=edge[i].nxt){
int v=edge[i].to;
if(dfn[v]==-1){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(dfn[u]g[maxn];
int du[maxn];
void suodian(){
memset(du,0,sizeof du);
for(int i=1;i<=taj;i++)g[i].clear();
for(int i=0;i
Tarjan 縮點 模板
縮點以後,整張圖變為dag 有向無環圖 此時運用拓撲排序 求出度入度就可以完成許多事 題目 include include include include include include define ll long long using namespace std const int maxn 1...
tarjan 模板 縮點
傳送門 首先呢,tarjan找乙個圖的強連通分量是基於對圖的dfs的。這中間開了乙個dfn代表dfs序,還有個low代表該節點在dfs形成的樹中能到達的最近的根。然後分情況進行更新 一會兒看我 吧 為了記錄乙個強聯通分量,我們還要在開乙個棧來儲存當前查詢的強連通分量。如果low x dfn x 那就...
學習 模板 tarjan縮點
我美好的早上就被tarjan毀掉了 微笑 放資料qwq謝謝你們讓我學會了tarjan 前兩個還是讓我了解了tarjan而最後乙個可就厲害了還讓我鞏固了topo sort dag 上的dp!學習筆記詳見注釋quq 1 include2 include3 include4 define maxn 100...