社区讨论
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 条回复,欢迎继续交流。
正在加载回复...