社区讨论
70pts求条
P3225[HNOI2012] 矿场搭建参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @miimuj03
- 此快照首次捕获于
- 2025/11/28 17:00 3 个月前
- 此快照最后确认于
- 2025/11/29 15:15 3 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M=2*1e6+10,N=5*1e5+10;
int n,cnt=1,h[N],u,v,cjs;
int dfn[N],low[N],sjz;
struct node{
int to,next;
}e[2*M+10];
void add(int x,int y){
++cnt;
e[cnt].to=y;
e[cnt].next=h[x];
h[x]=cnt;
}
int bcc;
stack<int> tk;
vector<int> ans[N];
int gd[N];
void Tarjan(int u,int fa){
++sjz;
dfn[u]=sjz;
low[u]=sjz;
tk.push(u);
if(u==fa&&h[u]==0){
bcc++;
ans[bcc].push_back(u);
}
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(dfn[v]==0){
Tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
gd[u]=1;
bcc++;
int t;
do{
t=tk.top();
tk.pop();
ans[bcc].push_back(t);
}while(t!=v);
ans[bcc].push_back(u);
}
}
else{
low[u]=min(low[u],dfn[v]);
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while(cin>>n){
if(n==0) break;
cjs++;
cnt=1;
bcc=0;
memset(h,0,sizeof h);
memset(gd,0,sizeof gd);
memset(low,0,sizeof low);
memset(dfn,0,sizeof dfn);
for(int i=1;i<=n;i++) ans[i].clear();
for(int i=1;i<=n;i++){
cin>>u>>v;
if(u!=v){
add(u,v);
add(v,u);
}
}
for(int i=1;i<=n;i++){
if(dfn[i]==0){
while(!tk.empty()){
tk.pop();
}
sjz=0;
Tarjan(i,i);
}
}
int wxy1=1,wxy2=0;
for(int i=1;i<=bcc;i++){
int gds=0;
for(int a:ans[i]){
if(gd[a]==1){
gds++;
}
}
if(ans[i].size()>1){
if(gds==0){
wxy1*=((ans[i].size()*(ans[i].size()-1))/2);
wxy2+=2;
}
else if(gds==1){
wxy1*=(ans[i].size()-1);
wxy2++;
}
}
}
printf("Case %lld: %lld %lld\n",cjs,wxy2,wxy1);
}
return 0;
}
变量名猎奇不要在意
回复
共 5 条回复,欢迎继续交流。
正在加载回复...