第9个点TLE求助
查看原帖
第9个点TLE求助
359270
是青白呀白鸽子楼主2021/7/19 10:26

RT

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge{
	int to,next;
}e[40005];
int first[40005],np=0,now_size,oth[40005];
bool vis[40005],nie=0;
stack<int>stk;
vector<int>ans;
void add(int x,int y)
{
	e[++np]=(edge){y,first[x]};
    first[x]=np;
}
void init()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=2*n;i++)
	{
		if(i%2==1)oth[i]=i+1;
		else oth[i]=i-1;
	}
	for(int i=1;i<=m;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,oth[b]);
		add(b,oth[a]);
	}
}
bool dfs(int x)
{
	if(vis[x])return 1;
	if(vis[oth[x]])return 0;
	stk.push(x);
	now_size++;
	vis[x]=1;
	for(int i=first[x];i;i=e[i].next)
	{
		int j=e[i].to;
		if(!dfs(j))return 0;
	}
	return 1;
}
void twosat()
{
	for(int i=1;i<=n;i++)
	{
		if(vis[2*i-1]||vis[2*i])continue;
		now_size=0;
		if(!dfs(2*i-1))
		{
			for(int j=1;j<=now_size;j++)
			{
				int x=stk.top();
				stk.pop();
				vis[x]=0;
			}
			if(!dfs(2*i))
			{
				nie=1;
				return;
			}
		}
	}
}
void output()
{
	if(nie)
	{
		printf("NIE");
		return;
	}
	while(!stk.empty())
	{
		int x=stk.top();
		ans.push_back(x);
		stk.pop();
	}
	sort(ans.begin(),ans.end());
	for(int i=0;i<ans.size();i++)
	    printf("%d\n",ans[i]);
}
int main()
{
	init();
	twosat();
	output();
	return 0;
}
2021/7/19 10:26
加载中...