POJ1236 強連通 (縮點後度數的應用)

2021-06-26 04:00:20 字數 1814 閱讀 2899

題意:

一些學校有乙個傳送訊息的體系,現在給你一些可以直接傳送訊息的一些關係(單向)然後有兩個問題

(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,將這些點...