Cod sursa(job #3138877)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 23 iunie 2023 11:08:28
Problema Party Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
//Ilie Dumitru
#include<cstdio>
#include<vector>
#include<bitset>
const int NMAX=256;

int N, N2;
std::vector<int> G[NMAX];
std::bitset<NMAX> set, col;
int updated[NMAX], cntU;

inline int sim(int n) {return (N+n)%N2;}

bool dfs(int node)
{
	if(set[node%N])
	{
		if(col[node%N]!=node/N)
			return 1;
		return 0;
	}

	set[node%N]=1;
	col[node%N]=node/N;
	updated[cntU++]=node%N;

	int i;

	for(i=0;i<(int)G[node].size();++i)
		if(dfs(G[node][i]))
			return 1;

	return 0;
}

void reset()
{
	int i;

	for(i=0;i<cntU;++i)
		set[updated[i]]=0;
}

int main()
{
	FILE* f=fopen("party.in", "r"), *g=fopen("party.out", "w");
	//FILE* f=stdin, *g=stdout;
	int i, a, b, c, _, ina, inb, oua, oub;

	fscanf(f, "%d%d", &N, &_);
	N2=N<<1;
	for(i=0;i<_;++i)
	{
		fscanf(f, "%d%d%d", &a, &b, &c);
		--a;
		--b;
		ina=a+(c>1)*N;
		inb=b+(c&1)*N;
		oua=a+(c<2)*N;
		oub=b+(!(c&1))*N;
		G[ina].push_back(oub);
		G[inb].push_back(oua);
	}

	for(i=0;i<N;++i, cntU=0)
		if(dfs(i+N))
		{
			reset();
			dfs(i);
		}

	for(i=a=0;i<N;++i)
		a+=col[i];
	fprintf(g, "%d\n", a);
	for(i=0;i<N;++i)
		if(col[i])
			fprintf(g, "%d\n", i+1);

	fclose(f);
	fclose(g);
	return 0;
}