Cod sursa(job #2229002)

Utilizator DACSTEPStepan Dacian DACSTEP Data 5 august 2018 17:05:34
Problema Party Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("party.in");
ofstream fo("party.out");
int n,m;
int k,CLAUZE[3001][2];
int VIZ[205];
vector <int> ADJ[205];
vector <int> ADJT[205];
int S[205],kstiva;

int df(int v)
{
	vector <int> :: iterator it;
	VIZ[v]=1;
	for (it=ADJ[v].begin();it!=ADJ[v].end();it++)
	{
		int varf;
		varf=(*it);
		if (VIZ[varf]==0)
			df(varf);
	}
	S[++kstiva]=v;
}

int dft(int v)
{
	vector <int> :: iterator it;
	VIZ[v]=0;
	for (it=ADJT[v].begin();it!=ADJT[v].end();it++)
	{
		int varf;
		varf=(*it);
		if (VIZ[varf]==-1 && VIZ[varf^1]==-1)
			dft(varf);
	}
}

int main()
{
	fi>>n>>m;
	for (int i=1;i<=m;i++)
	{
		int x,y,z;
		fi>>x>>y>>z;
		if (z==0)
		{
			/// cel putin unul dintre x si y participa la petrecere
			/// x v y
			k++;
			CLAUZE[k][0]=x;
			CLAUZE[k][1]=y;
		}
		if (z==1)
		{
			/// daca x nu participa atunci nici y nu participa
			/// daca x participa, atunci y poate sa faca ce vrea
			k++;
			CLAUZE[k][0]=x;
			CLAUZE[k][1]=-y;			
		}
		if (z==2)
		{
			/// daca y nu participa atunci nici x nu participa
			/// daca y participa, atunci x poate sa faca ce vrea
			k++;
			CLAUZE[k][0]=-x;
			CLAUZE[k][1]=y;			
		}
		if (z==3)
		{
			/// nu participa si x si y
			k++;
			CLAUZE[k][0]=-x;
			CLAUZE[k][1]=-y;				
		}
	}
	/// se construieste graful de inferente
	/// precum si graful transpus
	for (int i=1;i<=k;i++)
	{
		int a, b;
		int aa, bb;
		a=CLAUZE[i][0];
		b=CLAUZE[i][1];
		if (a>0)
			aa=2*a;
		else
			aa=2*(-a);
		if (b>0)
			bb=2*b;
		else
			bb=2*(-b);
		ADJ[aa].push_back(bb^1);
		ADJ[bb].push_back(aa^1);
		ADJT[bb^1].push_back(aa);
		ADJT[aa^1].push_back(bb);
	}
	/// se aplica algoritmul Kosaraju-Sharir
	/// se depun varfurile 2..2n+1 intr-o stiva
	kstiva=0;
	for (int i=2;i<=2*n+1;i++)
		if (VIZ[i]==0)
			df(i);
	for (int i=2;i<=2*n+1;i++)
		VIZ[i]=-1;
	for (int i=kstiva;i>=1;i--)
	{
		int v;
		v=S[i];
		if (VIZ[v]==-1 && VIZ[v^1]==-1)
			dft(v);
	}
	int rez=0;
	for (int i=1;i<=n;i++)
		if (VIZ[i<<1]==0)
			;
		else
			rez++;
	fo<<rez<<"\n";
	for (int i=1;i<=n;i++)
		if (VIZ[i<<1]==0)
			;
		else
			fo<<i<<"\n";
	fi.close();
	fo.close();
	return 0;
}