社区讨论

90分求助

P3225[HNOI2012] 矿场搭建参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7crfc1
此快照首次捕获于
2025/11/20 19:33
4 个月前
此快照最后确认于
2025/11/20 19:33
4 个月前
查看原帖
Wa第四个点 求助
CPP
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define MAXN 500+10
#define MAXM 500000+10
using namespace std;
int read(){
	int out=0;
	char c=getchar();
	while(c<48||c>57) c=getchar();
	while(c<=57&&c>=48){
		out=(out<<1)+(out<<3)+c-48;
		c=getchar();
	}
	return out;
}
void write(ll x){
	if(x>9) write(x/10);
	putchar(x%10+48);
}
struct Edge{int v,next;}edge[MAXM];
int n,m,cnt,dep;
int dfn[MAXN],low[MAXN],iscut[MAXN],fa[MAXN],head[MAXN],vis[MAXN];
inline void addedge(int u,int v){
	edge[++cnt].v=v;
	edge[cnt].next=head[u];
	head[u]=cnt;
}
void tarjan(int u){
	low[u]=dfn[u]=++dep;
	int child=0;
	for(int i=head[u];~i;i=edge[i].next){
		int v=edge[i].v;
		if(!dfn[v]){
			++child;
			fa[v]=u;
			tarjan(v);
			low[u]=low[v]<low[u]?low[v]:low[u];
			if((!(~fa[u]))&&child>1) iscut[u]=1;
			else if((~fa[u])&&low[v]>=dfn[u]){
				iscut[u]=1;
			}
		}
		else if(v!=fa[u]){
			low[u]=dfn[v]<low[u]?dfn[v]:low[u];
		}
	}
}
void init(){
	memset(head,-1,sizeof(head));
	memset(fa,-1,sizeof(fa));
	memset(iscut,0,sizeof(iscut));
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	memset(vis,0,sizeof(vis));
	cnt=0,dep=0;
	for(int i=1;i<=m;++i){
		int u=read();
		int v=read();
		n=max(n,max(u,v));
		addedge(u,v);
		addedge(v,u);
	}
	for(int i=1;i<=n;++i){
		if(!dfn[i]) tarjan(i);
	}
}
ll num,cut,group;
void dfs(int u){
	vis[u]=group;
	++num;
	for(int i=head[u];~i;i=edge[i].next){
		int v=edge[i].v;
		if(iscut[v]&&vis[v]!=group){
			++cut;
			vis[v]=group;
		}
		if(!vis[v]){
			dfs(v);
		}
	}
}	
ll ans1,ans2;
int main(){
	int Case=0;
	while(m=read()){
		init();
		ans1=0,ans2=1,group=0;;
		for(int i=1;i<=n;++i){
			if(!vis[i]&&!iscut[i]){
				++group;
				num=cut=0;
				dfs(i);				
				if(!cut){
					ans1+=2;
					ans2*=(((num-1)*num)>>1);
				}
				else if(cut==1){
				++ans1;
				ans2*=num;
				}
			}
		}
		printf("Case ");
		write(++Case);
		putchar(':');
		putchar(32);
		write(ans1);
		putchar(32);
		write(ans2);
		putchar(10);
	}
	return 0;
}
		
			

回复

2 条回复,欢迎继续交流。

正在加载回复...