Cod sursa(job #2986400)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 28 februarie 2023 16:01:21
Problema Party Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
//Ilie Dumitru
#include<cstdio>
#include<vector>
#include<algorithm>
const int NMAX=128;

std::vector<int> G[NMAX<<1];
unsigned long long int visited[NMAX>>6], coming[NMAX>>6];
int N, M;

bool dfs(int node)
{
	if(!(visited[(node%N)>>6]&(1ULL<<((node%N)&63))))
	{
		coming[(node%N)>>6]|=((unsigned long long int)node/N)<<((node%N)&63);
		bool ans=1;
		visited[(node%N)>>6]|=1ULL<<((node%N)&63);

		for(int i=0;i<(int)G[node].size();++i)
			ans&=dfs(G[node][i]);
		if(!ans)
			coming[(node%N)>>6]&=~(1ULL<<((node%N)&63));
		return ans;
	}
	return node/N==(int)(1&(coming[(node%N)>>6]>>((node%N)&63)));
}

void dfsClear(int node)
{
	if(visited[(node%N)>>6]&(1ULL<<((node%N)&63)))
	{
		visited[(node%N)>>6]^=1ULL<<((node%N)&63);

		for(int i=0;i<(int)G[node].size();++i)
			dfsClear(G[node][i]);
	}
}

int main()
{
	FILE* f=fopen("party.in", "r"), *g=fopen("party.out", "w");
	int i, a, b, c;

	fscanf(f, "%d%d", &N, &M);

	for(i=0;i<M;++i)
	{
		fscanf(f, "%d%d%d", &a, &b, &c);
		--a;
		--b;
		switch(c)
		{
		case 0:
			G[a].push_back(b+N);
			G[b].push_back(a+N);
			break;
		case 1:
			G[a].push_back(b);
			G[b+N].push_back(a+N);
			break;
		case 2:
			G[b].push_back(a);
			G[a+N].push_back(b+N);
			break;
		case 3:
			G[a+N].push_back(b);
			G[b+N].push_back(a);
			break;
		}
	}

	for(i=0;i<N;++i)
	{
		if(!dfs(i+N))
		{
			dfsClear(i+N);
			dfs(i);
		}
	}

	fprintf(g, "%d\n", __builtin_popcountll(coming[0])+__builtin_popcountll(coming[1]));
	for(i=0;i<N;++i)
		if(coming[i>>6]&(1ULL<<(i&63)))
			fprintf(g, "%d\n", i+1);

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