Pagini recente » Cod sursa (job #946720) | Cod sursa (job #2706776) | Cod sursa (job #22262) | Cod sursa (job #1663) | Cod sursa (job #2984740)
//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)+3], coming[(NMAX>>6)+3];
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]&=~(1<<((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]&(1<<(i&63)))
fprintf(g, "%d\n", i+1);
fclose(f);
fclose(g);
return 0;
}