構(gòu)造強(qiáng)連通圖

給定一張有向圖,最少添加幾條邊使得有向圖成為一個(gè)強(qiáng)連通圖 ? ?
以下內(nèi)容為轉(zhuǎn)載

將有向圖變?yōu)閺?qiáng)連通圖
①連通圖

找出所有的強(qiáng)連通分量, 然后縮成一個(gè)點(diǎn),然后統(tǒng)計(jì)縮點(diǎn)之后的新圖的出度為0的點(diǎn)的個(gè)數(shù)(記為cntOut),和入度為0的點(diǎn)的個(gè)數(shù)(記為cntIn)

那么要加邊的條數(shù)就是max(cntOut,cntIn)

這個(gè)為什么呢蹦浦?? 因?yàn)樽卜洌绻粋€(gè)點(diǎn)的入度為0盲镶,那么說明這個(gè)點(diǎn)是不可達(dá)的,如果一個(gè)點(diǎn)的出度為0蝌诡,那么說明這個(gè)點(diǎn)到其它點(diǎn)是不可達(dá)的溉贿。

為了解決這個(gè)情況,那么只要在出度為0的點(diǎn)(設(shè)為u)和入度為0的點(diǎn)之間連一條u-->v的邊浦旱,那么就解決了這種情況宇色。

不斷的連邊,只要一個(gè)點(diǎn)問題沒解決就要連邊闽寡, 所以是在兩者之間取max

注意,如果圖本來就是強(qiáng)連通圖,那么會(huì)縮成一個(gè)點(diǎn),它出入度都為0,即max(cntOut,cntIn)=1,但本來不需要連任何邊,所以ans=0,ans!=max(cntOut,cntIn),這個(gè)要特判

②非連通圖

對(duì)于每個(gè)連通的分支之間,按照上面的方法變成強(qiáng)連通分量尼酿。

至于兩個(gè)連通分量之間爷狈,連一條你指向我的邊,再連一條我指向你的邊就行了裳擎。

I - Proving Equivalences

#include <cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;
const int MAXN=20010;
const int MAXE=50010;
struct Node
{
    int to,next;
}edge[MAXE];
int head[MAXN],cnt;
void addEdge(int u,int v)
{
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
int low[MAXN],dfn[MAXN],clocks;
int sccno[MAXN],blocks;
int in[MAXN],out[MAXN];
int onStack[MAXN];
stack<int> sta;
void DFS(int u)
{
    low[u]=dfn[u]=++clocks;
    sta.push(u);
    onStack[u]=1;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].to;
        if(dfn[v]==0)
        {
            DFS(v);
            low[u]=min(low[v],low[u]);
        }
        else if(onStack[v]) low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
        blocks++;
        while(true)
        {
            int x=sta.top();
            sta.pop();
            onStack[x]=0;
            sccno[x]=blocks;
            if(x==u) break;
        }
    }
}
void work(int n)
{
    memset(dfn,0,sizeof(dfn));
    memset(sccno,0,sizeof(sccno));
    memset(in,0,sizeof(in));
    memset(out,0,sizeof(out));
    memset(onStack,0,sizeof(onStack));
    blocks=clocks=0;
    for(int i=1;i<=n;i++)
    {
        if(dfn[i]==0) DFS(i);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=head[i];j!=-1;j=edge[j].next)
        {
            if(sccno[i]!=sccno[edge[j].to])
            {
                in[sccno[edge[j].to]]++;
                out[sccno[i]]++;
            }
        }
    }
    if(blocks==1)
    {
        printf("0\n");
        return;
    }
    int inZero=0,outZero=0;
    for(int i=1;i<=blocks;i++)
    {
        if(in[i]==0) inZero++;
        if(out[i]==0) outZero++;
    }
    printf("%d\n",max(inZero,outZero));
}
int main()
{
    int n,m,a,b,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        cnt=0;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            addEdge(a,b);
        }
        work(n);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涎永,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鹿响,更是在濱河造成了極大的恐慌羡微,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惶我,死亡現(xiàn)場(chǎng)離奇詭異妈倔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绸贡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門盯蝴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人听怕,你說我怎么就攤上這事捧挺。” “怎么了尿瞭?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵闽烙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我声搁,道長(zhǎng)黑竞,這世上最難降的妖魔是什么捕发? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮摊溶,結(jié)果婚禮上爬骤,老公的妹妹穿的比我還像新娘。我一直安慰自己莫换,他們只是感情好霞玄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拉岁,像睡著了一般坷剧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喊暖,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天惫企,我揣著相機(jī)與錄音,去河邊找鬼陵叽。 笑死狞尔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巩掺。 我是一名探鬼主播偏序,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胖替!你這毒婦竟也來了研儒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤独令,失蹤者是張志新(化名)和其女友劉穎端朵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燃箭,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冲呢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了招狸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碗硬。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瓢颅,靈堂內(nèi)的尸體忽然破棺而出恩尾,到底是詐尸還是另有隱情,我是刑警寧澤挽懦,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布翰意,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冀偶。R本人自食惡果不足惜醒第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望进鸠。 院中可真熱鬧稠曼,春花似錦、人聲如沸客年。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)量瓜。三九已至司恳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绍傲,已是汗流浹背扔傅。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烫饼,地道東北人猎塞。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像杠纵,于是被迫代替她去往敵國(guó)和親荠耽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容