Cod sursa(job #1738555)

Utilizator mariusn01Marius Nicoli mariusn01 Data 6 august 2016 23:37:25
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <fstream>
#include <iostream>
#include <vector>

#define DIM 300
using namespace std;

int sol[DIM], v[DIM];
vector<int> L[DIM];

int n, m, nr, index, lev[DIM], low[DIM], st[DIM], varf, x, y, z, in[DIM], is[DIM];

inline int Minus(int x) {
    if (x <= n)
        return n+x;
    else
        return x-n;
}

void tarjan(int nod) {
    index ++;
    lev[nod] = index;
    low[nod] = index;
    st[++varf] = nod;
    v[nod] = 1;
    is[nod] = 1;
    for (int i=0;i<L[nod].size();i++) {
        int vecin = L[nod][i];
        if (v[vecin] == 0) {
            tarjan(vecin);
            low[nod] = min(low[nod], low[vecin]);
        } else
            if (is[vecin])
                low[nod] = min(low[nod], low[vecin]);
    }

    if (low[nod] == lev[nod]) {
        do {
            x = st[varf--];
            is[x] = 0;
            if (sol[x] == 0) {
                sol[x] = 1;
                sol[Minus(x)] = 2;
            }

        } while(x != nod);
    }

}


int main () {
    ifstream fin ("party.in");
    ofstream fout("party.out");

    fin>>n>>m;
    for (int i=1;i<=m;i++) {
        fin>>x>>y>>z;
        if (z == 0) {
            L[Minus(x)].push_back(y);
            L[Minus(y)].push_back(x);
            in[x] = 1;
            in[y] = 1;
        } else
            if (z == 1) {
                L[Minus(x)].push_back(Minus(y)), in[ Minus(y) ] = 1;
                L[y].push_back(x), in[ x ] = 1;
            }
            else
                if (z == 2) {
                    L[Minus(y)].push_back(Minus(x)), in[ Minus(x) ] = 1;
                    L[x].push_back(y), in[ y ] = 1;
                } else {
                    L[x].push_back(Minus(y)), in[Minus(y)] = 1;
                    L[y].push_back(Minus(x)), in[Minus(x)] = 1;
                }
    }
/*
    for (int i=1;i<=2*n;i++) {
        cout<<i<<": ";
        for (int j=0;j<L[i].size();j++)
            cout<<L[i][j]<<" ";
        cout<<"\n";
    }
*/
    for (int i=1;i<=n+n;i++)
        if (v[i] == 0) {
            tarjan(i);
        }

    for (int i=1;i<=n;i++)
        if (sol[i] == 1) {
            nr++;
        }

    fout<<nr<<"\n";
    for (int i=1;i<=n;i++)
        if (sol[i] == 1) {
            fout<<i<<"\n";
        }
    return 0;
}