RE求调
查看原帖
RE求调
881015
Resstifnurvˆwˆ.tar.gz楼主2023/10/18 10:03
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

int n,m;
const int N=1e3+10,M=1e6+10;
bool g[N][N];

int to[M],nt[M],idx,h[N];
inline void add(int x,int y){
	to[idx]=y;
	nt[idx]=h[x];
	h[x]=idx++;
}

int timestamp=0;
int dfn[N];
int low[N];
int stk[N],tt=-1;

int root;
vector<int> vct;
bool ok[N];

int cl[N];
bool is_in_bcc[N];
bool dfs(int u,int fa){
	cl[u]=(!cl[fa]);
	for(int i=h[u];i!=-1;i=nt[i]){
		int j=to[i];
		if(!is_in_bcc[j]||j==fa) continue;
		if(cl[j]==cl[u]) return true;
		else if(dfs(j,u)) return true;
	}
	return false;
}
void check_bcc(){
	memset(cl,-1,sizeof(cl));
	cl[0]=0;
	if(dfs(vct[0],0)){
		for(int i=0;i<(int)vct.size();i++){
			ok[vct[i]]=true;
		}
	}
	memset(is_in_bcc,0,sizeof(is_in_bcc));
	vct.clear();
}

void tarjan(int u){
	timestamp++;
	low[u]=dfn[u]=timestamp;
	stk[++tt]=u;
	
	for(int i=h[u];i!=-1;i=nt[i]){
		int j=to[i];
		if(!dfn[j]){
			tarjan(j);
			low[u]=min(low[u],low[j]);
			if(dfn[u]<=low[j]){
				int t;
				do{
					t=stk[tt--];
					vct.push_back(t);
					is_in_bcc[t]=true;
				}while(t!=j);
				vct.push_back(u);
				is_in_bcc[u]=true;
				check_bcc();
			}
		}
		else low[u]=min(low[u],dfn[j]);
	}
}

inline int read(){
	int ret=0;
	char ch=' ',c=getchar();
	while(!('0'<=c&&c<='9')) ch=c,c=getchar();
	while('0'<=c&&c<='9') ret=((ret<<1)+(ret<<3)+c-'0'),c=getchar();
	return ch=='-'?-ret:ret;
}

void init(){
	memset(h,-1,sizeof(h));
	idx=0;
	timestamp=0;
	tt=-1;
	memset(dfn,0,sizeof(dfn));
	memset(ok,0,sizeof(ok));
	memset(g,0,sizeof(g));
}

int main(){
	while(1){
		init();
		n=read();m=read();
		if(n==0&&m==0) break;
		int x,y;
		for(int i=1;i<=m;i++){
			x=read();y=read();
			g[y][x]=g[x][y]=true;
		}
		for(int i=1;i<=n;i++){
			g[i][i]=true;
			for(int j=1;j<=n;j++){
				if(!g[i][j]) add(i,j);
			}
		}
		
		for(int i=1;i<=n;i++){
			if(!dfn[i]){
				root=i;
				tarjan(root);
			}
		}
		
		int cnt=0;
		for(int i=1;i<=n;i++) cnt+=(!ok[i]);
		printf("%d\n",cnt);
	}
	return 0;
}
2023/10/18 10:03
加载中...