HDU 3844 Mining Your Own Business(割點,變形,開棧,經典)

來源:互聯網
上載者:User

標籤:

 

題意:給出一個連通圖,要求將某些點塗黑,使得無論哪個點(包括相關的邊)撤掉後能夠成功使得剩下的所有點能夠到達任意一個塗黑的點,顏料不多,塗黑的點越少越好,並輸出要塗幾個點和有多少種塗法。

 

思路:

  要使得任意撤掉一個點都能使其他點能夠到達黑點,那麼點雙連通分量能保證這點,那麼就在同個點雙連通分量內塗黑1個點。但是每個【點雙連通分量】都塗嗎?太浪費顏料了,那就縮點成樹,只需要塗葉子即可,那就找度為1的縮點。但是種數呢?葉子內的點除了割點外都是可以塗黑的,因為如果黑色割點被撤掉,那麼葉子中的其他點怎麼辦?所以不能塗割點,每個黑點有【葉子中的點數-1】種塗法,所有黑店的塗法相乘為第2個結果。

  特殊情況,因為給的是連通圖且至少有2個點,那麼還可能會出現沒有割點的情況(僅1個點雙連通分量),那就直接塗黑兩個,以防一個黑點被撤掉。

  此題出現的連續的點可能多達10萬個,DFS就會爆棧。在C++下可以手動開棧,G++下的還不清楚怎麼開。

 

  1 #pragma comment(linker,"/STACK:102400000,102400000")//開棧  2 //#include <bits/stdc++.h>  3 #include <iostream>  4 #include <cstdio>  5 #include <cstring>  6 #include <algorithm>  7 #include <vector>  8 #include <unordered_map>  9 #include <stack> 10 #define LL long long 11 #define pii pair<int,int> 12 using namespace std; 13 const int N=100000+5; 14 const int INF=0x7f7f7f7f; 15 int up; 16 int low[N], dfn[N]; 17 bool iscut[N]; 18 int dfn_clock, bcc_cnt, bcc_no[N]; 19 unordered_map<int,int> mapp; 20 stack< pii >  stac; 21 vector<int> bcc[N], vect[N]; 22  23 void DFS(int x, int far)//tarjan 24 { 25     dfn[x]=low[x]=++dfn_clock; 26  27     int chd=0; 28     for(int i=0; i<vect[x].size(); i++) 29     { 30         int t=vect[x][i]; 31         if(!dfn[t]) 32         { 33             chd++; 34             stac.push(make_pair(x,t)); 35             DFS(t,x); 36             low[x]=min( low[x], low[t]); 37             if(low[t]>=dfn[x]) 38             { 39                 iscut[x]=true;    //需要標記割點 40                 bcc[++bcc_cnt].clear(); 41                 while(true) 42                 { 43                     int a=stac.top().first; 44                     int b=stac.top().second; 45                     stac.pop(); 46                     if(bcc_no[a]!=bcc_cnt) 47                     { 48                         bcc[bcc_cnt].push_back(a); 49                         bcc_no[a]=bcc_cnt; 50                     } 51                     if(bcc_no[b]!=bcc_cnt) 52                     { 53                         bcc[bcc_cnt].push_back(b); 54                         bcc_no[b]=bcc_cnt; 55                     } 56                     if(a==x&&b==t)    break; 57                 } 58             } 59         } 60         else if( dfn[t]<dfn[x] && t!=far) 61         { 62             stac.push(make_pair(x,t)); 63             low[x]=min(low[x],dfn[t]); 64         } 65     } 66     if(chd==1&&far==0)    iscut[x]=false;        //根 67 } 68  69 void find_bcc(int Case) 70 { 71     memset(low,0,sizeof(low)); 72     memset(dfn,0,sizeof(dfn)); 73     memset(iscut,0,sizeof(iscut)); 74     memset(bcc_no,0,sizeof(bcc_no)); 75  76     dfn_clock=bcc_cnt=0; 77     for(int i=1; i<=up; i++)    if(!dfn[i])    DFS(i,0);   //深搜 78     LL ans1=0,ans2=1; 79  80     for(int i=1; i<=bcc_cnt; i++)    //統計度為多少 81     { 82         int cnt=0; 83         for(int j=0; j<bcc[i].size(); j++)    if(iscut[bcc[i][j] ])    cnt++;    //有割點就統計連通分量i的度。 84         if(cnt==1)    ans1++, ans2*=bcc[i].size()-1; 85     } 86     if(bcc_cnt==1)    ans1=2,ans2=(LL)bcc[1].size()*(bcc[1].size()-1)/2; 87     printf("Case %d: %lld %lld\n", Case, ans1, ans2); 88 } 89  90  91 int main() 92 { 93     freopen("input.txt", "r", stdin); 94     int a, b, n, j=0; 95     while(scanf("%d",&n), n) 96     { 97         mapp.clear(); 98         for(int i=1; i<N; i++)    vect[i].clear(); 99         up=0;100         for(int i=0; i<n; i++)101         {102             scanf("%d%d",&a,&b);103             if(!mapp[a])    mapp[a]=++up;104             if(!mapp[b])    mapp[b]=++up;//點號縮小為連續105 106             vect[mapp[a]].push_back(mapp[b]);107             vect[mapp[b]].push_back(mapp[a]);108         }109         find_bcc(++j);110     }111     return 0;112 }
AC代碼

 

HDU 3844 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.