Cod sursa(job #2219820)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 9 iulie 2018 20:00:41
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream fi("2sat.in");
ofstream fo("2sat.out");
int n,m;
int P[200001][2];
int X[200001];

int modul(int x)
{
	if (x>=0)
		return x;
	return -x;
}

int main()
{
	fi>>n>>m;
	for (int i=1;i<=m;i++)
	{
		int a,b,c;
		fi>>a>>b>>c;
		if (c==0)
		{
			P[i][0]=a;
			P[i][1]=b;
		}
		if (c==1)
		{
			P[i][0]=a;
			P[i][1]=-b;
		}
		if (c==2)
		{
			P[i][0]=-a;
			P[i][1]=b;
		}
		if (c==3)
		{
			P[i][0]=-a;
			P[i][1]=-b;
		}
	}
	/// se dau valori 1 tuturor variabilelor
	for (int i=1;i<=n;i++)
		X[i]=1;
	while (1)
	{
		int poz=0;
		for (int i=1;i<=m;i++)
		{
			int a,b;
			if (P[i][0]>0)
				a=X[P[i][0]];
			else
				a=1-X[-P[i][0]];
			if (P[i][1]>0)
				b=X[P[i][1]];
			else
				b=1-X[-P[i][1]];
			if (a==0 && b==0)
			{
				poz=i;
				break;
			}
		}
		if (poz==0)
			break;
		int v;
		v=rand()%2;
		X[modul(P[poz][v])]=1-X[modul(P[poz][v])];
	}
	int rez;
	rez=0;
	for (int i=1;i<=n;i++)
		if (X[i]==1)
			fo << X[2*i] << " ";
	/*fo<<rez<<"\n";
	for (int i=1;i<=n;i++)
		if (X[i]==1)
			fo<<i<<"\n";*/
	fi.close();
	fo.close();
	return 0;
}