poj1236 強連通分量 縮點

2021-06-05 20:02:11 字數 1170 閱讀 6480

【題意】

n(2【題解】

找強連通分量,縮點。記f[i]為縮完點後的新圖中各點入度,g[i]為出度,ans1為f[i]==0的點的數目,ans2為g[i]==0的點的數目則第一問為ans1,第二問則為max。

至於第二問的解釋,我的想法是對於得到的dag圖,考慮其中的出度為0的點和入度為0的點組成的點集v,將這些點相連,最多這需要max條邊,就能使整個圖成為強連通分量。

但是請注意,大家可能都沒發現,這個結論的前提是dag圖是連通的情況下才成立。如果dag圖有多個連通分量,則還要考慮將多個連通分量合併的所需代價。幸運的是,這道題保證了只有乙個連通分量。(題目第一句話所說)

#include #include using namespace std;

const int maxn=105;

const int maxe=105*105;

struct edge

e[maxe];

int g[maxn],dfn[maxn],low[maxn],v[maxn],f[maxn],s[maxn],b[maxn],h[maxn];

int n,tot=0,cnt=0,ans=0,times=0,t=0,ans2;

void ins(int x,int y)

void tarjan(int x)

if (v[y]==1)

low[x]=min(low[x],dfn[y]);

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

while (y!=x);

}}

int main()

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

if (v[i]==0)

tarjan(i);

if (cnt==1)

for (i=1;i<=tot;i++)

if (b[e[i].x]!=b[e[i].y])

ans=0;

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

if (g[i]==0) ans++;

cout << ans << endl;

ans2=0;

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

if (f[i]==0) ans2++;

cout << max(ans,ans2)<< endl;

}

poj 1236 強連通分量 縮點

有向無環圖中所有入度不為0的點,一定 可以由某個入度為0的點出發可達。假定有 n 個入度為0的點,m個出度為0的點,max m,n 就是第二個問題的解。include include include include include include include using namespace st...

poj1236 強連通分量 縮點

有一次比賽的時候遇到了一道強連通分量 縮點的題,過的人挺多,那個時候還沒有做過強連通的題,只能遺憾放棄。比賽回去,立馬整理了強連通縮點的模板,做了那道題。時隔多日,再找一道強連通的題,來聯絡一下 題目大意 有乙個有向圖,第一問 從幾個點開始走能夠全部遍歷一遍,第二問 如果要把整個有向圖變成強連通至少...

POJ 1236 強連通分量

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