POJ 1236 tarjan 強連通分量 縮點

2021-07-27 08:44:15 字數 1268 閱讀 9190

poj1236

問,對於乙個dag(又向無環圖):

1.至少要選幾個點,才能從這些點出發到達所有點

2.至少加入幾條邊,就能從圖中任何乙個點出發到達所有點

先求dag的強連通分量數,再縮點,可以用tarjan演算法來做。

第乙個問題:不難想到答案就是縮點之後入度為0的點的個數

第二個問題:設縮點後入度為0的個數是n,出度為0的個數是m,至少新增邊的條數就是max(n,m)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=105;

int n;

int dfn[maxn];

int low[maxn];

int vis[maxn];

int belong[maxn];//belong[i]表示i屬於縮點後的哪個節點

int cnt;

int out[maxn];

int in[maxn];

int tot;

struct edge

edge[maxn*maxn];

int edgecount;

int head[maxn];

void init()

void add_edge(int u,int v)

stack

st;

void tarjan(int u)//從節點x開始搜尋

else

if(vis[v])//被訪問過,還在佇列裡

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

}}void solve()

for(int u=1;u<=n;u++)}}

int ans1=0;

int ans2=0;

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

ans2=max(ans1,ans2);

if(cnt==1)printf("1\n0\n");

else

printf("%d\n%d\n",ans1,ans2);

}int main()

solve();

}return

0;}

poj1236 Tarjan演算法模板 詳解

思想 做一遍dfs,用dfn i 表示編號為i的節點在dfs過程中的訪問序號 也可以叫做開始時間 用low i 表示i節點dfs過程中i的下方節點所能到達的開始時間最早的節點的開始時間。初始時dfn i low i 在dfs過程中會形成一搜尋樹。在搜尋樹上越先遍歷到的節點,顯然dfn的值就越小。df...

POJ 1236 強連通分量

題目鏈結 翻譯一下題目吧,大致含義就是,有n個學校,現在要向n個學校傳遞乙個軟體,如果a學校願意支援b學校,那麼給了a,a就會給b,但是a支援b但是b不一定支援a 有向圖警告 要求什麼呢,最少給多少個學校就可以給到全部的學校,最少加幾個支援關係,可以使得給任意乙個學校就可以傳遞到全部學校去。思路 第...

poj 1236 強連通分量

題目大意 給定乙個n n 100 個點的有向圖,問 q1 最少需要選擇多少個點,使得從這些點出發能遍歷完整個圖 q2 最少需要新增多少條有向邊,使得整個圖成為強連通圖 分析 求出強連通分量後進行縮點,得到每個強連通分量的入度in,出度out q1 入度為0的強連通分量個數 q2 max 入度為0的強...