[HNOI2012]矿场搭建
生活随笔
收集整理的這篇文章主要介紹了
[HNOI2012]矿场搭建
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題解:
首先顯然這是要縮點的 縮點雙
直接對割點之間的聯(lián)通塊判斷一下連著幾個割點
連0個 cnt*(cnt-1)/2
連1個 cnt
連2個 0
代碼:
#include <bits/stdc++.h> using namespace std; #define ll long long #define N 2000 bool iscut[N],ff[N]; ll head[N],dfn[N],low[N],cc,now,l,num,cnt,T,color[N]; ll n,m; struct re{ll a,b,c; }a[N]; void arr(ll x,ll y) {a[++l].a=head[x];a[l].b=y;head[x]=l; } void tarjan(ll x,ll fa) {dfn[x]=low[x]=++now;ll child=0;ll u=head[x];while (u){ll v=a[u].b;if (!dfn[v]){child++;tarjan(v,x);low[x]=min(low[x],low[v]);if (low[v]>=dfn[x]) iscut[x]=1;} else{if (v!=fa) low[x]=min(low[x],dfn[v]);}u=a[u].a;}if (fa==0&&child==1) iscut[x]=0; } void dfs(ll x) {color[x]=cc;if (iscut[x]) return;ff[x]=1; cnt++;ll u=head[x];while (u){ll v=a[u].b;if (iscut[v]&&color[v]!=cc) num++;if (!ff[v]) dfs(v);u=a[u].a;} } int main() {freopen("noi.in","r",stdin);freopen("noi.out","w",stdout);while (cin>>m&&m){T++;n=0; memset(head,0,sizeof(head));now=l=0;memset(iscut,0,sizeof(iscut));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(ff,0,sizeof(ff));for (ll i=1;i<=m;i++){ll x,y;cin>>x>>y;n=max(n,max(x,y));arr(x,y); arr(y,x);}for (ll i=1;i<=n;i++)if(!dfn[i]) tarjan(i,0);ll ans=1,ans1=0;for (ll i=1;i<=n;i++)if (!iscut[i]&&!ff[i]){num=0; cnt=0; cc++;dfs(i);if (num==0) ans*=max(1ll,cnt*(cnt-1)/2),ans1+=min(cnt,2ll);if (num==1) ans*=cnt,ans1++;}cout<<"Case "<<T<<": "<<ans1<<" "<<ans<<endl;}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/yinwuxiao/p/8831728.html
總結(jié)
以上是生活随笔為你收集整理的[HNOI2012]矿场搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到佛像倒了意味什么
- 下一篇: 梦到大水是什么征兆