「BZOJ2730」[HNOI2012]矿场搭建

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N=510;
 5 int n,T,ans1,cnt,siz,dfn[N],low[N],timer;
 6 ll ans2;
 7 bool vis[N],iscut[N],viscut[N];
 8 struct Edge{
 9     int from,to;
10     Edge(int _from=0,int _to=0):from(_from),to(_to){}
11 }edge[N<<1];
12 vector<int>point[N];
13 int edge_tot;
14 void add_edge(int f,int t){
15     edge[edge_tot]=Edge(f,t);
16     point[f].push_back(edge_tot++);
17     return;
18 }
19 int ff[N];
20 void tarjan(int k,int fa){
21     ff[k]=fa;
22     int child=0;
23     dfn[k]=low[k]=++timer;
24     for(int i=point[k].size()-1;i>=0;i--){
25         Edge& e=edge[point[k][i]];
26         if(!dfn[e.to]){
27             child++;
28             tarjan(e.to,k);
29             low[k]=min(low[k],low[e.to]);
30             if(low[e.to]>=dfn[k]) iscut[k]=1;
31         }else if(dfn[e.to]<dfn[k]&&e.to!=fa) low[k]=min(dfn[e.to],low[k]);
32     }
33     if(!fa&&child==1) iscut[k]=0;
34     return;
35 }
36 void dfs(int k,int pre){
37     vis[k]=1,siz++;
38     for(int i=0;i<point[k].size();i++){
39         Edge& e=edge[point[k][i]];
40         if(iscut[e.to]&&!viscut[e.to]) viscut[e.to]=1,cnt++;
41         if(iscut[e.to]||pre==e.to||vis[e.to])continue;
42         dfs(e.to,k);
43     }
44     return;
45 }
46 void solve(){
47     int t1,t2,tot=0;
48     ans1=edge_tot=0,ans2=1,timer=0;
49     T++;
50     for(int i=1;i<=n;i++){scanf("%d%d",&t1,&t2);add_edge(t1,t2);add_edge(t2,t1);tot=max(tot,max(t1,t2));}
51     for(int i=1;i<=tot;i++) if(!dfn[i]) tarjan(i,0);
52     memset(vis,0,sizeof(vis));
53     for(int i=1;i<=tot;i++) if(!iscut[i]&&!vis[i]){
54         cnt=siz=0;
55         memset(viscut,0,sizeof(viscut));
56         dfs(i,0);
57         if(!cnt) ans1+=2,ans2*=siz*(siz-1)/2;
58         else if(cnt==1) ans1++,ans2*=siz;
59     }
60     printf("Case %d: %d %lld\n",T,ans1,ans2);
61     for(int i=1;i<=tot;i++) point[i].clear();
62     memset(iscut,0,sizeof(iscut));memset(dfn,0,sizeof(dfn));
63     memset(low,0,sizeof(low));
64     return;
65 }
66 int main(){
67     while(scanf("%d",&n)!=EOF){
68         if(!n) return 0;
69         solve();
70     }
71 }

 

转载于:https://www.cnblogs.com/mycups/p/8527898.html

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值