poj 3905 2-sat

很奇怪很奇怪的一件事情

输入的时候用scanf ("%s%s",s1,s2)竟然错了

最后无语的换了下输入,建图不难的

#include<stdio.h>

#include<string.h>

#include<vector>

#include<algorithm>

using namespace std;

const int MAX = 2011;

vector<int> edge[MAX];

int st[MAX];

int dfn[MAX],low[MAX];

int top,btype,tdfn;//btype:Á¬Í¨¿éµÄ¸öÊý

int belong[MAX];//µãÊôÓÚÄĸöÁ¬Í¨¿é

bool ins[MAX];

void dfs(int s)

{

	int i,t;

	dfn[s]=low[s]=++tdfn;

	ins[s]=true;

	st[++top]=s;

	for(i=0;i<edge[s].size();i++)

	{

		t=edge[s][i];

		if(!dfn[t])

		{

			dfs(t);

			if(low[t]<low[s]) low[s]=low[t];

		}

		else if(ins[t] && dfn[t]<low[s])  low[s]=dfn[t];

	}

	if(dfn[s]==low[s])

	{

		btype++;

		do

		{

			t=st[top--];

			ins[t]=false;

			belong[t]=btype;

		}while(t!=s);

	}

}

void SCC(int n)

{

	int i;

	top=btype=tdfn=0;

	memset(ins,false,sizeof(ins));

	memset(dfn,0,sizeof(dfn));

	for(i=1;i<=n;i++)

		if(!dfn[i])

			dfs(i);

}

int main()

{

	int n,m,i;

	while(scanf("%d%d",&n,&m)!=EOF)

	{

		for(i=0;i<=2*n;i++)

			edge[i].clear();

		for(i=0;i<m;i++)

		{

			for (i = 0; i < m; i++)

			{

				int rx,ry,x,y;

                scanf("%d%d",&x,&y);

				if (x > 0)

					rx = x + n;

				else

				{

					rx = -x;

					x = rx + n;

				}

				if (y > 0)

					ry = y + n;

				else

				{

					ry = -y;

					y = ry + n;

				}

				edge[rx].push_back(y);

				edge[ry].push_back(x);

			}

		}

		SCC(2*n);

		bool flag=true;

		for(i=1;i<=n;i++)

			if(belong[i]==belong[i+n])

				flag=false;

			if(flag) printf("1\n");

			else printf("0\n");

	}

	return 0;

}

  

你可能感兴趣的:(poj)