題意:
一些學校有乙個傳送訊息的體系,現在給你一些可以直接傳送訊息的一些關係(單向)然後有兩個問題
(1) 問你至少向多少個學校傳送訊息可以讓所有的學校都得到訊息
(2) 問至少加多少條邊可以讓所有學校達到訊息互通(變成強連通圖)
思路:比較簡單了,我們先強連通所點,然後對於第乙個問題,我們只要輸出入度為0的個數,這個很好理解,對於第二個問題,我們可以輸出max(入度為0的個數,出度為0的個數),這樣做是因為我們可以吧度數大的先用小的補充上,剩下的就隨意補充就行了,還有就是記得只有乙個聯通分量的時候特判一下,
ps :假如這個題目要是讓輸出解決方案的話也比較好弄,對於第乙個,每個入度為0的點給乙個,每個強連通分量《元素個數大於1的》給乙個就行了。對於第二個,就是先用小的填充大的,剩下的零頭隨意安排。
#include
#include
#include
#define n_node 100+10
#define n_edge 10000
+100
using
namespace std;
typedef
struct
star;
typedef
struct
edge;
edge edge[n_edge];
star e1[n_edge]
,e2[n_edge];
int list1[n_node]
,list2[n_node]
,tot;
int belong[n_node]
,cnt;
int mark[n_node];
stack<
int>sk;
void
add(
int a ,
int b)
void
dfs1
(int s)
sk.push
(s);
}void
dfs2
(int s)
}int
main ()}
memset
(mark ,0,
sizeof
(mark));
while
(!sk.
empty
()) sk.
pop();
for(i =
1;i <= n ;i ++)
cnt =0;
memset
(mark ,0,
sizeof
(mark));
while
(!sk.
empty
())int d1[n_node]=;
int d2[n_node]=;
for(i =
1;i <= nowid ;i ++)
int sum1 =
0,sum2 =0;
for(i =
1;i <= cnt ;i ++)
if(cnt ==1)
printf
("%d\n"
,sum2);
sum1 > sum2 ?
printf
("%d\n"
,sum1)
:printf
("%d\n"
,sum2);
}return0;
}
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的強...
poj1236 強連通分量 縮點
題意 n 2 題解 找強連通分量,縮點。記f i 為縮完點後的新圖中各點入度,g i 為出度,ans1為f i 0的點的數目,ans2為g i 0的點的數目則第一問為ans1,第二問則為max。至於第二問的解釋,我的想法是對於得到的dag圖,考慮其中的出度為0的點和入度為0的點組成的點集v,將這些點...