求助卡常
查看原帖
求助卡常
247388
WRuperD楼主2022/7/17 08:27

luoguAC,uvaTLE

#include<bits/stdc++.h>
using namespace std;
const int maxn = 500005;
#define int long long
int dfn[maxn], low[maxn];
vector <int> g[maxn];
bool vis[maxn];
bool vis2[maxn];
int cut[maxn];
int t, sccnum;
int root;


inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void write(int x) {
	if (x < 0) {
		x = ~(x - 1);
		putchar('-');
	}
	if (x > 9)
		write(x / 10);
	putchar(x % 10 + '0');
}


void tarjan(int u){
	dfn[u] = low[u] = ++t;
	int flag = 0;
	for(int i = 0; i < g[u].size(); i++){
		int v = g[u][i];
		if(!dfn[v]){
			tarjan(v);
			low[u] = min(low[u], low[v]); 
			if(low[v] >= dfn[u]){
				flag++;
				if(u != root or flag > 1)	cut[u] = 1;
			}
		}
		else low[u] = min(low[u], dfn[v]);
	} 
}

bool iscut(int u){
	if(cut[u])	return 1;
	vis[u] = 1;
	bool f = false;
	for(int v = 0; v < g[u].size(); v++){
		if(!vis[g[u][v]])	{
			if(iscut(g[u][v]))	f = true; 
		} 
	} 
	return f;
} 

int dfs(int u){
	int cnt = 1;
	vis2[u] = 1;
	for(int v = 0; v < g[u].size(); v++){
		if(!vis2[g[u][v]])	cnt += dfs(g[u][v]); 
	}
	return cnt;
}

signed main(){
	int ttt = 0;
	while(1){
		int n = read();
	//	cin>>n;
		if(n == 0)	break;
		int MAXN = -1;
		int m = n;
		for(int i = 1; i <= m; i++){
			int u = read(), v = read();
	//		cin>>u>>v;
			g[u].push_back(v);
			g[v].push_back(u);
			MAXN = max(MAXN, max(u, v));
		}
		for(int i = 1; i <= n; i++){
			if(!dfn[i])	root = i, tarjan(i);
		}
		int ret = 0;
		long long ans = 1;
		int ans2 = 0;
		bool f = true;
		for(int i = 1; i <= n; i++){
			if(cut[i]){
				memset(vis, 0, sizeof(vis));
				memset(vis2, 0, sizeof(vis2));
				f = 0;
				for(int j = 0; j < g[i].size(); j++){
					vis[i] = 1;
					if(!iscut(g[i][j])){
						vis2[i] = 1; 
						if(!vis2[g[i][j]])	ans2 += 1;	 
						ans *= 	dfs(g[i][j]);
					}
				} 
			} 
		}
		printf("Case %lld: ", ++ttt);
	//	puts(": ") ;
	//	cout<<"Case "<<++ttt<<": ";
		for(int i = 1; i <= n; i++){
			g[i].clear();
		}
		memset(dfn, 0, sizeof(dfn));
		memset(low, 0, sizeof(low));
		memset(cut, 0, sizeof(cut));
		memset(vis, 0, sizeof(vis));
		memset(vis2, 0, sizeof(vis2));
		t = 0, sccnum = 0, root = 0;
		if(f){
			printf("2 %lld\n", (MAXN-1)*MAXN/2);
	//		cout<<2<<' '<<<<endl;
			continue;
		}
		printf("%lld %lld\n", ans2, ans);
	//	cout<<ans2<<' '<<ans<<endl;
		
	}
	return	0; 
} 	
2022/7/17 08:27
加载中...