萌新求助
查看原帖
萌新求助
92682
Eric_cai楼主2021/1/14 15:30
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<cstdio>
#define maxm 2000005
#define maxn 1005
using namespace std;
int n,m;
struct Eric_cai
{
	int to,next;
};
Eric_cai EC[maxm];
int head[maxn],cnt;
void add(int u,int v)
{
	EC[++cnt].to=v;
	EC[cnt].next=head[u];
	head[u]=cnt;
}
bool vis[maxn][maxn];
int dfn[maxn],low[maxn],times,ans;
struct node
{
	int u,v;
	node(int uu,int vv)
	{
		u=uu,v=vv;
	}
};
int num;
stack<node> s;
vector<int> vec[maxn];
int no[maxn];
void Tarjan(int now,int fa)
{
	dfn[now]=low[now]=++times;
	for(int i=head[now];i!=0;i=EC[i].next)
	{
		if(dfn[EC[i].to]==0)
		{
			Tarjan(EC[i].to,now);
			low[now]=min(low[now],low[EC[i].to]);
			if(low[EC[i].to]<dfn[now])
			{
				vec[++num].clear();
				s.push(node(now,EC[i].to));
				while(!s.empty())
				{
					node tp=s.top();
					if(no[tp.u]!=num) vec[num].push_back(tp.u);
					if(no[tp.v]!=num) vec[num].push_back(tp.v);
					no[tp.u]=num;
					no[tp.v]=num;
					if(tp.u==now && tp.v==EC[i].to) break;
				}
				s.pop();
			}
		}
		else if(EC[i].to!=fa && dfn[EC[i].to]<dfn[now]) 
		{
			low[now]=min(low[now],dfn[EC[i].to]);
			s.push(node(now,EC[i].to));
		}
	}
}
int col[maxn];
bool check(int number,int now,int Col)
{
	col[now]=Col;
	for(int i=head[now];i!=0;i=EC[i].next)
	{
		if(no[EC[i].to]!=number) continue;
		if(col[EC[i].to]==Col) return 0;
		if(col[EC[i].to]==0)
		    if(check(number,EC[i].to,3-Col)==0) return 0;
	}
	return 1;
}
bool flag[maxn];
void init()
{
	memset(flag,0,sizeof(flag));
	memset(col,0,sizeof(col));
	memset(no,0,sizeof(no));
	while(!s.empty()) s.pop();
	num=times=cnt=ans=0;
	memset(vis,0,sizeof(vis));
	memset(head,0,sizeof(head));
	memset(low,0,sizeof(low));
	memset(dfn,0,sizeof(dfn));
}
int main()
{
	int u,v;
	while(1)
	{
		init();
		scanf("%d%d",&n,&m);
		if(n==0 && m==0) break;
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&u,&v);
			vis[u][v]=vis[v][u]=1;
		}
		for(int i=1;i<=n;i++)
		    for(int j=1;j<=n;j++)
		        if(i!=j && vis[i][j]==0) add(i,j);
		for(int i=1;i<=n;i++)
		{
			times=0;
			if(dfn[i]==0) Tarjan(i,0);
		}
		for(int i=1;i<=num;i++)
			if(check(i,vec[i][0],1)==0 || vec[i].size()<3)
				for(int j=0;j<vec[i].size();j++) flag[vec[i][j]]=1;
		for(int i=1;i<=n;i++) if(flag[i]==1) ans++;
		printf("%d\n",ans);
	}
	return 0;
}
2021/1/14 15:30
加载中...