代码求调,谢谢大佬
查看原帖
代码求调,谢谢大佬
648660
Name1楼主2022/10/11 13:24
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int N=1e3+10,M=1e3+10;
int n,m;
int cnt,head[N];
struct Edge{int nxt,to;}e[N<<1];
inline void add(int u,int v)
{
	e[++cnt]=(Edge){head[u],v};
	head[u]=cnt;
}
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
	return x*f;
}
int T,st[N],BCC,root,dfntime,block[N][M],dfn[N],low[N],top,cut[N];
inline void tarjan(int u)
{
	dfn[u]=low[u]=++dfntime;
	st[++top]=u;
	int cc=0;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if((u==root&&cnt>1)||(u!=root&&dfn[u]<=low[v])) cut[u]=1;
			if(dfn[u]<=low[v])
			{
				++BCC;
				block[BCC][0]=0;
				do
				{
					block[BCC][++block[BCC][0]]=st[top--];
				}while(st[top+1]!=v);
				block[BCC][++block[BCC][0]]=u;
			}
		}
		else low[u]=min(low[u],dfn[v]);
	}
}
ll ans,sum;
signed main()
{
	while(scanf("%d",&m)&&m)
	{
			n=0;
		for(int i=1;i<=m<<1;i++)
			dfn[i]=low[i]=head[i]=0;
		cnt=top=dfntime=0;
		while(m--)
		{
			int u=read(),v=read();
			n=max(n,max(u,v));
			add(u,v),add(v,u);
		}
		BCC=0;
		for(int i=1;i<=n;i++) cut[i]=0;
		for(int i=1;i<=n;i++) 
			if(!dfn[i])
			{
				root=i;
				tarjan(root);
			}
//		for(int i=1;i<=n;i++) if(cut[i]) cout<<i<<' ';
//		puts("");
//		for(int i=1;i<=BCC;i++) printf("%d ",block[i][0]);
//		puts("");
		ans=0,sum=1;
		for(int i=1;i<=BCC;i++)
		{
			int l=block[i][0],gsum=0;
			for(int j=1;j<=l;j++) 
			{
				if(cut[block[i][j]]) gsum++;
			}
			if(gsum==0) ans+=2,sum*=l*(l-1)/2;
			else if(gsum==1) ans+=1,sum*=(l-1); 
		}
//		puts("");
		printf("Case %d: %lld %lld\n",++T,ans,sum);
//		cout<<endl;
	}	
	return 0;
}
2022/10/11 13:24
加载中...