Cod sursa(job #2984726)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 24 februarie 2023 18:52:46
Problema Party Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
//Ilie Dumitru
#include<cstdio>
#include<vector>
#include<algorithm>
const int NMAX=128;

std::vector<int> G[NMAX<<1], toAdd[2], sol;
unsigned long long int visited[(NMAX>>6)+3];
int N, M;

void dfs(int node)
{
	if(!(visited[(node%N)>>6]&(1<<((node%N)&63))))
	{
		toAdd[node/N].push_back(node%N);
		visited[(node%N)>>6]|=1<<((node%N)&63);

		int i;
		for(i=0;i<(int)G[node].size();++i)
			dfs(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)
	{
		toAdd[0].clear();
		toAdd[1].clear();
		dfs(i+N);
		if(toAdd[0].size()>toAdd[1].size())
		{
			for(a=0;a<(int)toAdd[0].size();++a)
				sol.push_back(toAdd[0][a]);
		}
		else
		{
			for(a=0;a<(int)toAdd[1].size();++a)
				sol.push_back(toAdd[1][a]);
		}
	}

	std::sort(sol.begin(), sol.end());

	fprintf(g, "%d\n", (int)sol.size());
	for(i=0;i<(int)sol.size();++i)
		fprintf(g, "%d\n", sol[i]+1);

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