【問題描述】
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...