求助(P3225已过,UVA WA)
查看原帖
求助(P3225已过,UVA WA)
151415
Edward1002001FJ-321625楼主2022/10/31 09:50

P3225已过

#include<cstdio>
#include<cstring>
#include<vector>
int h[50007],nx[100007],vx[100007],ec;
#define add(u,v) (nx[++ec]=h[u],vx[ec]=v,h[u]=ec)
int dfn[50007],low[50007],dc;
int stk[50007],tp;
bool cut[50007];
int bc;
void ckmn(int&a,int b){(a>b)&&(a=b);}
void ckmx(int&a,int b){(a<b)&&(a=b);}
std::vector<int> dcc[50007];
void dfs(int i,int l)
{
	dfn[i]=low[i]=++dc;
	stk[++tp]=i;
	int cld=0;
	for(int t=h[i];t;t=nx[t])
		if(!dfn[vx[t]])
		{
			dfs(vx[t],i);
			ckmn(low[i],low[vx[t]]);
			if(low[vx[t]]>=dfn[i])
			{
				cut[i]=(l||(++cld)>=2);
				dcc[++bc].push_back(i);
				while(stk[tp]!=i)dcc[bc].push_back(stk[tp--]);
			}
		}
		else if(vx[t]!=l)ckmn(low[i],dfn[vx[t]]);
}
int main()
{
	int n,m,u,v,ans;
	unsigned long long Ans;
	for(int C=1;scanf("%d",&m),m;++C)
	{
		memset(dfn,ans=tp=ec=dc=bc=n=0,sizeof dfn);
		memset(cut,0,sizeof cut);
		memset(h,0,sizeof h);
		for(int i=1;i<=m;++i)scanf("%d%d",&u,&v),ckmx(n,u),ckmx(n,v),add(u,v),add(v,u);
		for(int i=1;i<=n;++i)if(!dfn[i])dfs(i,0);
		for(int i=Ans=1;i<=bc;++i)
		{
			int siz=dcc[i].size(),csiz=0;
			for(auto&u:dcc[i])csiz+=cut[u];
			if(csiz==1)++ans,Ans*=siz-1;
			else if(!csiz)ans+=2,Ans*=(siz*(siz-1)/2);
			dcc[i].clear();
		}
		printf("Case %d: %d %llu\n",C,ans,Ans);
	}
	return 0;
}
2022/10/31 09:50
加载中...