蒟蒻求调
查看原帖
蒟蒻求调
280604
DiDi123楼主2022/10/4 23:04
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1000001
int n,m;
int hx[1001][1001];
struct edge
{
	int to,nex;
}Edge[MAXN<<1];
int head[MAXN],cnt;
void add(int u,int v)
{
	Edge[cnt].nex=head[u];
	Edge[cnt].to=v;
	head[u]=cnt++;
}
int dfn[MAXN],low[MAXN],cut[MAXN],num,root,sum,ans;
int buk[2000],color[2000],vis[2000],mark[2000];
stack <int> st;
vector <int> dcc[MAXN];
void tarjan(int x)
{
	dfn[x]=low[x]=++num;
	st.push(x);
	if(x==root && head[x]==-1)
	{
		dcc[++sum].push_back(x);
		return;
	}
	int flag=0;
	for(int i=head[x];i!=-1;i=Edge[i].nex)
	{
		int y=Edge[i].to;
		int z;
		if(!dfn[y])
		{
			tarjan(y);
			low[x]=min(low[x],low[y]);
			if(low[y]>=dfn[x])
			{
				flag++;
				if(x!=root || flag>1) cut[x]=1;
				sum++;
				while(1)
				{
					z=st.top();
					st.pop();
					dcc[sum].push_back(z);
					if(z==y) break;
				}
				dcc[sum].push_back(x);
			}
		}
		else low[x]=min(low[x],dfn[y]);
	}
}
void bfs(int x)
{
	memset(buk,0,sizeof(buk));
	memset(color,0,sizeof(color));
	memset(vis,0,sizeof(vis));
	for(int i=0;i<dcc[x].size();i++)
		buk[dcc[x][i]]=1;
	color[dcc[x][0]]=1;
	queue <int> q;
	q.push(dcc[x][0]);
	while(q.size())
	{
		int t=q.front();
		//	cout<<t<<endl;
		q.pop();
		if(vis[t]) continue;
		vis[t]=1;
		for(int i=head[t];i!=-1;i=Edge[i].nex)
		{
			int y=Edge[i].to;
			if(!buk[y]) continue;
			int cor=3-color[t];
			if(color[y] && color[y]!=cor)
			{
				for(int j=0;j<dcc[x].size();j++)
					mark[dcc[x][j]]=1;
				return;
			}
			color[y]=cor;
			q.push(y);
			//	cout<<y<<endl;
		}
	}
}
inline int read()
{
	int x=0;
	char ch=getchar();
	while(ch>'9' || ch<'0') ch=getchar();
	while(ch>='0' && ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x;
}
int main()
{
	while(n=read(),m=read())
	{
		if(n==0 && m==0) break;
		memset(head,-1,sizeof(head));
		memset(hx,0,sizeof(hx));
	//	memset(Edge,0,sizeof(Edge));
		ans=cnt=num=0;
		for(int i=1;i<=n;i++)
			dcc[i].clear();
		memset(dfn,0,sizeof(dfn));
		memset(low,0,sizeof(low));
		memset(cut,0,sizeof(cut));
		memset(mark,0,sizeof(mark));
		int a1,a2;
		for(int i=1;i<=m;i++)
		{
			a1=read(),a2=read();
			hx[a1][a2]++,hx[a2][a1]++;
		}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(i!=j && !hx[i][j])
					add(i,j);
		for(int i=1;i<=n;i++)
			if(!dfn[i]) root=i,tarjan(i);
		for(int i=1;i<=sum;i++)
			bfs(i);
		for(int i=1;i<=n;i++)
			if(!mark[i]) ans++;
		printf("%d\n",ans);

	}



}
2022/10/4 23:04
加载中...