日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3225 [HNOI2012]矿场搭建

發布時間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3225 [HNOI2012]矿场搭建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路:$tarjan+組合$

提交:1次

題解:

先$tarjan$求出割點,然后按連通塊的性質分類討論:

1.若沒有與割點相連,則需要兩個井,防止一個壞掉。

2.若有一個割點相連,修一個井,考慮井壞了從割點跑到相鄰的連通塊,或者割點壞了從井逃跑。

3.若有兩個割點相連,則不用修井,直接跑到相鄰連通塊。

#include<cstdio> #include<iostream> #include<cstring> #define R register int const int M=510; using namespace std; inline int g() {R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix; } int n,m,num,cnt,deg,ans,T,rt,tot,C; long long anss; int vr[M<<1],nxt[M<<1],fir[M],dfn[M],low[M],c[M]; bool cut[M]; inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;} inline void clear() {memset(fir,0,sizeof(fir)),memset(c,0,sizeof(c));memset(cut,0,sizeof(cut)),memset(dfn,0,sizeof(dfn));num=cnt=tot=n=ans=T=0; anss=1; } inline void tarjan(int u) { dfn[u]=low[u]=++num; R deg=0;for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];if(!dfn[v]) {tarjan(v); low[u]=min(low[u],low[v]);if(dfn[u]<=low[v]&&(++deg>1||rt!=u)) cut[u]=true;} else low[u]=min(low[u],dfn[v]);} } inline void dfs(int u) {c[u]=C; ++cnt;for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];if(cut[v]&&c[v]!=C) ++tot,c[v]=C;if(!c[v]) dfs(v);} } signed main() { R t=0;while(m=g(),m!=0) { clear();for(R i=1,u,v;i<=m;++i) u=g(),v=g(),add(u,v),add(v,u),n=max(n,max(u,v));for(R i=1;i<=n;++i) if(!dfn[i]) rt=i,tarjan(i);for(R i=1;i<=n;++i) if(!c[i]&&!cut[i]) {++C; cnt=tot=0;dfs(i); if(!tot) ans+=2,anss*=cnt*(cnt-1)/2;if(tot==1) ++ans,anss*=cnt;} printf("Case %d: %d %lld\n",++t,ans,anss);} }

2019.07.22

?

轉載于:https://www.cnblogs.com/Jackpei/p/11225128.html

總結

以上是生活随笔為你收集整理的P3225 [HNOI2012]矿场搭建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。