Pagini recente » Cod sursa (job #2904065) | Cod sursa (job #1806694) | Cod sursa (job #709106) | Cod sursa (job #3188186) | Cod sursa (job #879471)
Cod sursa(job #879471)
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 256
#define non(x) ((x)<=N?(x+N):(x-N))
using namespace std;
vector <int> G[nmax],Gt[nmax],deque;
int N,Answer;
bool used[nmax],mark[nmax];
void DFS(int Nod) {
used[Nod]=0;
mark[non(Nod)]=1;
for(int i=0;i<Gt[Nod].size();i++)
if(used[Gt[Nod][i]])
DFS(Gt[Nod][i]);
}
void TopologicalSort(int Nod) {
used[Nod]=1;
for(int i=0;i<G[Nod].size();i++)
if(!used[G[Nod][i]])
TopologicalSort(G[Nod][i]);
deque.push_back(Nod);
}
void solve() {
int Nod;
for(Nod=1;Nod<=2*N;Nod++)
if(!used[Nod])
TopologicalSort(Nod);
reverse(deque.begin(),deque.end());
for(Nod=0;Nod<2*N;Nod++)
if(used[deque[Nod]]&&used[non(deque[Nod])])
DFS(deque[Nod]);
}
void AddEdges(int x,int y) {
G[non(x)].push_back(y);
G[non(y)].push_back(x);
Gt[x].push_back(non(y));
Gt[y].push_back(non(x));
}
void read() {
int x,y,type,M;
ifstream in("party.in");
in>>N>>M;
while(M--) {
in>>x>>y>>type;
switch(type) {
case 0:AddEdges(x,y);break;
case 1:AddEdges(x,non(y));break;
case 2:AddEdges(non(x),y);break;
case 3:AddEdges(non(x),non(y));break;
}
}
in.close();
}
void write() {
ofstream out("party.out");
for(int i=1;i<=N;i++)
Answer+=mark[i];
out<<Answer<<'\n';
for(int i=1;i<=N;i++)
if(mark[i])
out<<i<<'\n';
out.close();
}
int main() {
read();
solve();
write();
return 0;
}