HUD2767 高階版 強連通分量

2021-08-03 14:57:17 字數 2122 閱讀 1069

【問題描述】

michael為救哥哥身陷囹圄,被關進foxriver監獄。為準備越獄,他需要散布訊息給監獄中其他人來共同協作,但是監獄中魚龍混雜,分成各個小團體,內部訊息傳遞單向傳輸。問題1:初始至少需要向多少個透漏訊息,使得監獄內所有人都獲知訊息。

問題2,至少需要新增幾條傳輸線路(邊),使任意向乙個人散步訊息後,經過若干次傳送,監獄內所有的人最終都能得到訊息。

【輸入格式】

從檔案break.in中輸入資料。

輸入的第一行包含乙個整數 n:監獄人數(2 <= n <= 100)。用前 n 個正整數標識每個人。接下來 n 行中每行都表示乙個訊息傳遞列表(分發列表)。第 i+1 行包括 i 的接收訊息的人的識別符號。每個列表用 0 結束。空列表只用乙個 0 表示。

【輸出格式】

輸出到檔案break.out中。

輸出的第一行包含乙個正整數:問題1的解。第二行應該包含問題2的解。

【樣例輸入】

5 2 4 3 0

4 5 0

0 0

1 0

【樣例輸出】 1 2

問題二即為hud2767的問題,簡單來說就是tarjan跑完dag後詢問還要加多少邊又可以變成變成乙個強連通分量。

1. 求出所有強連通分量

2. 每個強連通分量縮成一點,則形成乙個有向無環圖dag。

3. dag上面有多少個入度為0的頂點,問題1的答案就是多少

在dag上要加幾條邊,才能使得dag變成強連通的,問題2的答案就是多少

加邊的方法:

要為每個入度為0的點新增入邊,為每個出度為0的點新增出邊

假定有 n 個入度為0的點,m個出度為0的點,如何加邊?

把所有入度為0的點編號 0,1,2,3,4 ….n -1

每次為乙個編號為i的入度0點可達的出度0點,新增一條出邊,連到編號為(i+1)%n 的那個出度0點,

這需要加n條邊

若 m <= n,則加了這n條邊後,已經沒有入度0點,則問題解決,一共加了n條邊

若 m > n,則還有m-n個入度0點,則從這些點以外任取一點,和這些點都連上邊,即可,這還需加m-n條邊。

所以,max(m,n)就是第二個問題的解

此外:當只有乙個強連通分支的時候,就是縮點後只有乙個點,雖然入度出度為0的都有乙個,但是實際上不需要增加清單的項了,所以答案是1,0;

#include

#include

#include

#include

#include

#define mem(a,b) memset(a,b,sizeof(a))

using

namespace

std;

const

int maxn=110;

int n,m,len,tim,cnt;

stack

q;struct nodee[maxn*maxn];

bool flag[maxn];

void insert(int,int);

void dfs(int );

int low[maxn],head[maxn],dfn[maxn],a[maxn]=,ru[maxn],w[maxn],chu[maxn],belong[maxn];

int ma()

for(int i=1;i<=n;i++)if(dfn[i]==0)dfs(i);

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

}

}int ans1=0,ans2=0;

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

ans2=max(ans2,ans1);

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

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

}void insert(int x,int y)

void dfs(int x)

else

if(flag[t]==1)low[x]=min(low[x],dfn[t]);

}if(dfn[x]==low[x])while(k!=x);

}}int hhh=ma();

int main()

這種思維方式還是很值得背板子的同學們學習。

hdu2767 強連通分量

hdu2767 proving equivalences 傳送門題意 給定乙個 n 1 leq n leq 20000 個頂點,m 0 leq m leq 50000 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...

hdu 2767強連通分量練習

判斷強連通圖之後,果斷要做做強連通分量的題目,之前做求割點的題目的時候就已經學過了tarjan演算法了。但是還是不會用,一開始看到這個題目的時候不知道怎麼辦,感覺就是有種怪怪的感覺。看了網上的 出度和入度的判斷真的還蠻精妙的。通過一邊tarjan演算法已經將乙個圖分解成了很多個前連通圖了。這要計算出...

hdu 1269 hdu 2767 強連通分量)

1 include2 include3 include4 const int maxn 10000 10 5 using namespace std 6 vectormp maxn 7 stacks 8int n,m 9int count 10int cnt 11bool mark maxn 12i...