Cod sursa(job #547060)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 5 martie 2011 20:34:45
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<stdio.h>
#include<vector>
#define Nmax 210
using namespace std;

int n,m,i,a,b,tip,sol[Nmax],invitati,viz[Nmax],S[Nmax],nn ; 

vector<int> G[Nmax], T[Nmax]; 

int non ( int x ) 
{
	if( x <= n ) return x+n;
	return x - n ;
}

void sortaret ( int nod ) 
{
	int N = G[nod].size(),i;
	
	viz[nod] = 1 ;
	
	for( i = 0 ; i < N ; i++ )
		if( !viz[ G[nod][i] ] )  sortaret( G[nod][i] ) ;
	
	S[--nn] = nod ; 
}

void dfs ( int nod ) 
{
	int N = T[nod].size(),i;
	
	viz[nod] = 0 ;
	
	sol[ non(nod) ] = 1 ;  
	if( nod > n ) invitati++;
	
	for( i = 0 ; i < N ; i++ )
		if( viz[ T[nod][i] ] ) dfs( T[nod][i] ) ;
}

int main()
{
	freopen("party.in","r",stdin);
	freopen("party.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for( i = 1 ; i <= m ; i++ )
	{
		scanf("%d %d %d",&a,&b,&tip);
		
		if( tip == 0 ) 
		{
			G[non(a)].push_back(b);
			G[non(b)].push_back(a);
			T[a].push_back(non(b));
			T[b].push_back(non(a));
		}
		else if( tip == 1 ) 
		{
			G[non(a)].push_back(non(b));
			G[b].push_back(a);
			
			T[non(b)].push_back(non(a));
			T[a].push_back(b);
		}
		else if( tip == 2 )
		{
			G[non(b)].push_back(non(a));
			G[a].push_back(b);
			
			T[non(a)].push_back(non(b));
			T[b].push_back(a);
		}
		else
		{
			G[a].push_back(non(b));
			G[b].push_back(non(a));
			T[non(a)].push_back(b);
			T[non(b)].push_back(a);
		}
	}
	
	nn = n + n + 1 ;
	
	for( i = 1 ; i <= n+n ; i++ )
		if( !viz[i]) sortaret(i);
	
	for( i = 1 ; i <= n+n ; i++ )
		if( viz[ S[i] ] && viz[ non(S[i]) ] ) 
			dfs( S[i] ) ;
		
	printf("%d\n",invitati);
	
	for( i = 1 ; i <= n ; i++ )
		if( sol[i] ) printf("%d\n",i);
	
	return 0;
}