70pts ,求调
查看原帖
70pts ,求调
847889
Chenzhilong楼主2024/10/6 10:46
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1005;
vector<int> g[maxn];
int flag[maxn],dfn[maxn],low[maxn],timer;
void tj(int x,int fa)
{
    dfn[x]=low[x]=++timer;
    int c=0;
    for(auto to:g[x])
    {
        if(!dfn[to])
        {
            c++;
            tj(to,x);
            low[x]=min(low[x],low[to]);
            if(low[to]>=dfn[x]) flag[x]=1;
        }
        else if(to!=fa)
        {
            low[x]=min(low[x],dfn[to]);
        }
    }
    if(x==fa&&c<2) flag[x]=0;
}
int kk,k,vis[maxn];
set<int> s;
void dfs(int x)
{
	vis[x]=1;
	k++;
	for(auto to:g[x])
	{
		if(!vis[to])
		{
			if(flag[to]) s.insert(to);
			else dfs(to);
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int m;
	int t=0;
	while(cin>>m&&m)
	{
		memset(flag,0,sizeof(flag));
		memset(dfn,0,sizeof(dfn));
		memset(low,0,sizeof(low));
		memset(vis,0,sizeof(vis));
		timer=0;
		for(int i=0;i<maxn;i++) g[i].clear();
		t++;
		int n=0;
		for(int i=1;i<=m;i++)
		{
			int u,v;cin>>u>>v;
			n=max({u,v,n});
			g[u].push_back(v);
			g[v].push_back(u);
		}
		for(int i=1;i<=n;i++) if(!dfn[i]) tj(i,-1);
		int sum=1,ans=0;
		for(int i=1;i<=n;i++)
		{
			if(!flag[i]&&!vis[i])
			{
				s.clear();
				kk=0;
				k=0;
				dfs(i);
				kk=s.size();
				if(kk==1)
				{
					ans++;
					sum*=k;
				}
				if(!kk)
				{
					ans+=2;
					sum*=k*(k-1)/2;
				}
			}
		}
		cout<<"Case "<<t<<": "<<ans<<' '<<sum<<endl;
	}
	return 0;
}
2024/10/6 10:46
加载中...