hdu 3394 Railway 點雙連通分量 + 橋

hdu 3394 Railway
雙連通分量

題意:給一個無向圖。如果至少有兩個環(huán)共用了一些邊过蹂,那么這些邊被認(rèn)為是“沖突邊”禾进。如果一些邊不在任何一個環(huán)中漱挎,這些邊被認(rèn)為是“多余邊”力细。你要找出這個圖中有多少“多余邊”和“沖突邊”然后輸出條數(shù)睬澡。另外這圖不一定是連通的

1.“多余邊”不在任何一個環(huán)中,那么多余邊一定是橋眠蚂,所以統(tǒng)計這個無向圖中有多少橋即可

2.“沖突邊”有多少煞聪,這個有點費勁,但是不難想到逝慧。如果一個環(huán)比較特殊昔脯,n個點剛好n條邊,例如(1,2)(2,3)(1笛臣,3)這種環(huán)云稚,這個環(huán)內(nèi),一條“沖突邊”都沒有沈堡,但是如果一個環(huán)內(nèi)的邊數(shù)大于點數(shù)静陈,那么這個環(huán)內(nèi)所有邊都是“沖突邊”(真可惜,因為有多出來的那些邊后诞丽,相當(dāng)于把最外面的大環(huán)分割成了內(nèi)部的幾個小環(huán)鲸拥,這些小環(huán)和小環(huán)之間,小環(huán)和大環(huán)之間一定會公用一些邊僧免,這些邊就是“沖突邊”刑赶,而且可以發(fā)現(xiàn),所有邊都會被公用懂衩,太可惜了......)撞叨,例如sample里面的(5,6)(5,4)(6,7)(4,7)(5,7),相當(dāng)于最外面的大環(huán)<6,5,4,7,6> 浊洞, 而里面的邊(5,7)把這個大環(huán)分割成了兩個小環(huán)牵敷。因為是求環(huán),所以求的是點雙連通分量。

所以做法就是沛申,求出這個無向圖有多少個點雙連通分量,對于每個點雙連通分量姐军,如果內(nèi)部的邊數(shù)>點數(shù)铁材,那么這些邊全部都是沖突邊

#include <cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
const int MAXN=10010;
const int MAXE=200010;
struct Node
{
    int to,next,cut;
};
Node edge[MAXE];
int cnt,head[MAXN];
void addEdge(int u,int v)
{
    edge[cnt].to=v;
    edge[cnt].cut=0;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
struct Edge
{
    int u,v;
    Edge(){}
    Edge(int u,int v):u(u),v(v){}
};
stack<Edge> coolector;
int low[MAXN],dfn[MAXN],clocks;
int isCut[MAXN],bccno[MAXN],bcc_cnt;
vector<int> bcc[MAXN];
vector<Edge> edgeCnt[MAXN];
int bridges;
void DFS(int u,int e)
{
    low[u]=dfn[u]=++clocks;
    int child=0;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        if(e==(i^1)) continue;
        int v=edge[i].to;
        Edge e(u,v);
        if(dfn[v]==0)
        {
            coolector.push(e);
            child++;
            DFS(v,i);
            low[u]=min(low[u],low[v]);
            if(low[v]>=dfn[u])
            {
                isCut[u]=true;
                bcc_cnt++;
                bcc[bcc_cnt].clear();
                edgeCnt[bcc_cnt].clear();
                while(true)
                {
                    Edge tmp=coolector.top();
                    coolector.pop();
                    edgeCnt[bcc_cnt].push_back(tmp);
                    if(bccno[tmp.u]!=bcc_cnt) {bccno[tmp.u]=bcc_cnt;bcc[bcc_cnt].push_back(tmp.u);}
                    if(bccno[tmp.v]!=bcc_cnt) {bccno[tmp.v]=bcc_cnt;bcc[bcc_cnt].push_back(tmp.v);}
                    if(tmp.u==u&&tmp.v==v) break;
                }
            }
            if(low[v]>dfn[u])
            {
                edge[i].cut=1;
                edge[i^1].cut=1;
                bridges++;
            }
        }
        else if(dfn[v]<dfn[u])
        {
            coolector.push(e);
            low[u]=min(low[u],dfn[v]);
        }
    }
    if(e<0&&child==1) isCut[u]=0;
}
void find_cc(int n)
{
    memset(isCut,0,sizeof(isCut));
    memset(bccno,0,sizeof(bccno));
    memset(dfn,0,sizeof(dfn));
    clocks=bcc_cnt=bridges=0;
    for(int i=0;i<n;i++)
    {
        if(dfn[i]==0)
        {
            DFS(i,-1);
        }
    }
}
void work(int n)
{
    find_cc(n);
    int edges=0;
    for(int i=1;i<=bcc_cnt;i++)
    {
        if(edgeCnt[i].size()>bcc[i].size())
        {
            edges+=edgeCnt[i].size();
        }
    }
    printf("%d %d\n",bridges,edges);
}
int main()
{
    int n,m,a,b;
    while(scanf("%d%d",&n,&m)!=EOF,n+m)
    {
        memset(head,-1,sizeof(head));
        cnt=0;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            addEdge(a,b);
            addEdge(b,a);
        }
        work(n);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奕锌,隨后出現(xiàn)的幾起案子著觉,更是在濱河造成了極大的恐慌,老刑警劉巖惊暴,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饼丘,死亡現(xiàn)場離奇詭異,居然都是意外死亡辽话,警方通過查閱死者的電腦和手機(jī)肄鸽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門卫病,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人典徘,你說我怎么就攤上這事蟀苛。” “怎么了逮诲?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵帜平,是天一觀的道長。 經(jīng)常有香客問我梅鹦,道長裆甩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任齐唆,我火速辦了婚禮嗤栓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝶念。我一直安慰自己抛腕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布媒殉。 她就那樣靜靜地躺著担敌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廷蓉。 梳的紋絲不亂的頭發(fā)上全封,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機(jī)與錄音桃犬,去河邊找鬼刹悴。 笑死,一個胖子當(dāng)著我的面吹牛攒暇,可吹牛的內(nèi)容都是我干的土匀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼形用,長吁一口氣:“原來是場噩夢啊……” “哼就轧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起田度,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤妒御,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镇饺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乎莉,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惋啃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哼鬓。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肥橙,靈堂內(nèi)的尸體忽然破棺而出魄宏,到底是詐尸還是另有隱情,我是刑警寧澤存筏,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布宠互,位于F島的核電站,受9級特大地震影響椭坚,放射性物質(zhì)發(fā)生泄漏予跌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一善茎、第九天 我趴在偏房一處隱蔽的房頂上張望券册。 院中可真熱鬧,春花似錦垂涯、人聲如沸烁焙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骄蝇。三九已至,卻和暖如春操骡,著一層夾襖步出監(jiān)牢的瞬間九火,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工册招, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留岔激,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓是掰,卻偏偏與公主長得像虑鼎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子键痛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

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