UVALive-5135 Mining Your Own Business (無向圖的雙連通分量)

來源:互聯網
上載者:User

標籤:

題目分析:在一張無向圖中,將一些點塗上黑色,使得刪掉圖中任何一個點時,每個連通分量至少有一個黑點。問最少能塗幾個黑點,並且在塗最少的情況下有幾種方案。

題目分析:顯然,一定不能塗割點。對於每一個連通分量,如果有1個割點,則必須塗上分量內除割點之外的任意一個點,如果有多個(2個及以上)割點,則這個分量不需要塗色。如果整張圖都沒有割點,那麼任選兩個點塗色即可,之所以要塗兩個,是要防止刪掉的電恰是黑點的情況。

 

代碼如下:

# include<iostream># include<cstdio># include<stack># include<map># include<vector># include<cstring># include<algorithm>using namespace std;const int maxn=100005;struct Edge{    int u,v,nxt;    Edge(int _u=0,int _v=0,int _nxt=0):u(_u),v(_v),nxt(_nxt){}};Edge e[maxn];int head[maxn],pre[maxn],iscut[maxn],low[maxn],bccno[maxn],cnt,bcc_cnt,dfs_cnt;map<int,int>mp;stack<Edge>s;vector<int>bcc[maxn];void add(int u,int v){    e[cnt].v=v;    e[cnt].nxt=head[u];    head[u]=cnt++;}void read(int m,int &n){    mp.clear();    int a,b;    cnt=n=0;    memset(head,-1,sizeof(head));    while(m--)    {        scanf("%d%d",&a,&b);        if(mp[a]==0)            mp[a]=++n;        if(mp[b]==0)            mp[b]=++n;        add(mp[a]-1,mp[b]-1);        add(mp[b]-1,mp[a]-1);    }}void dfs(int u,int fa){    int child=0;    low[u]=pre[u]=++dfs_cnt;    for(int i=head[u];i!=-1;i=e[i].nxt){        int v=e[i].v;        if(!pre[v]){            ++child;            s.push(Edge(u,v));            dfs(v,u);            low[u]=min(low[v],low[u]);            if(low[v]>=pre[u]){                iscut[u]=1;                bcc[++bcc_cnt].clear();                while(1)                {                    Edge x=s.top();                    s.pop();                    if(bccno[x.u]!=bcc_cnt){                        bcc[bcc_cnt].push_back(x.u);                        bccno[x.u]=bcc_cnt;                    }                    if(bccno[x.v]!=bcc_cnt){                        bcc[bcc_cnt].push_back(x.v);                        bccno[x.v]=bcc_cnt;                    }                    if(x.u==u&&x.v==v)                        break;                }            }        }else if(pre[v]<pre[u]&&v!=fa){            s.push(Edge(u,v));            low[u]=min(low[u],pre[v]);        }    }    if(fa<0&&child==1)        iscut[u]=0;}void findBcc(int n){    bcc_cnt=dfs_cnt=0;    memset(pre,0,sizeof(pre));    memset(low,0,sizeof(low));    memset(iscut,0,sizeof(iscut));    memset(bccno,0,sizeof(bccno));    for(int i=0;i<n;++i)        if(!pre[i])            dfs(i,-1);}void solve(int k){    long long ans1=0,ans2=1;    for(int i=1;i<=bcc_cnt;++i){        int ccnt=0;        for(int j=0;j<bcc[i].size();++j)            if(iscut[bcc[i][j]])                ++ccnt;        if(ccnt==1)            ++ans1,ans2*=(long long)(bcc[i].size()-ccnt);    }    if(bcc_cnt==1)        ans1=2,ans2=bcc[1].size()*(bcc[1].size()-1)/2;    printf("Case %d: %lld %lld\n",k,ans1,ans2);}int main(){    int n,m,cas=0;    while(scanf("%d",&m)&&m)    {        read(m,n);        findBcc(n);        solve(++cas);    }    return 0;}

  

UVALive-5135 Mining Your Own Business (無向圖的雙連通分量)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.