Cod sursa(job #1155790)

Utilizator PatrikStepan Patrik Patrik Data 27 martie 2014 10:39:00
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
    #include<cstdio>
    #include<vector>
    #include<cstring>
    using namespace std;
    #define NMAX 201
    #define pb push_back
    int N , M  , p[NMAX] , sol[NMAX] , nr , k , poz[NMAX] , rez;
    vector<int> G[NMAX] , Gt[NMAX] , CC[NMAX];
    bool u[NMAX];

    void read();
    void solve();
    void write();
    int abs(int x)
    {
        if(x < 0)return -x+N;
        return x;
    }
    int neg(int x)
    {
        if(x > N)return x-N;
        return x+N;
    }
    void dfs1(int nod);
    void dfs2(int nod);

    int main()
    {
        read();
        solve();
        write();
        return 0;
    }

    void read()
    {
        int x , y , t;
        freopen("party.in" , "r" , stdin );
        scanf("%d%d" , &N , &M );
        for(int i = 1 ; i<= M ; ++i )
        {
            scanf("%d%d%d" , &x , &y , &t);
            if(t == 1)y = neg(y);
            if(t == 2)x = neg(x);
            if(t == 3)x = neg(x),y = neg(y);
            G[neg(x)].pb(y);
            G[neg(y)].pb(x);
            Gt[y].pb(neg(x));
            Gt[x].pb(neg(y));
        }
    }

    void solve()
    {
        for(int i = 1 ; i <= 2*N ; ++i )
            if(!u[i])dfs1(i);
        memset(u,0,sizeof(u));
        for(int i = 2*N ; i ; i-- )
            if(!u[p[i]])nr++,dfs2(p[i]);
        memset(sol,0-1,sizeof(sol));
        for(int i = 1 ; i<= nr ; ++i )
        {
            if(sol[CC[i][0]] != -1)continue;
            for(int j = 0 ; j <(int)CC[i].size() ; ++j )
            {
                sol[CC[i][j]] = 0;
                sol[neg(CC[i][j])] = 1;
            }
        }
    }

    void dfs1(int nod)
    {
        u[nod] = 1;
        for(int j = 0 ; j <(int)G[nod].size() ; ++j )
        if(!u[G[nod][j]])dfs1(G[nod][j]);
        p[++k] = nod;
    }

    void dfs2(int nod)
    {
        u[nod] = 1;
        CC[nr].pb(nod);
        poz[nod] = nr;
        for(int j = 0 ; j < (int)Gt[nod].size() ; ++j )
            if(!u[Gt[nod][j]])dfs2(Gt[nod][j]);
    }

    void write()
    {
        freopen("party.out" , "w" , stdout );
        for(int i = 1 ; i<= N ; ++i )
            rez+=sol[i];
        printf("%d\n" , rez);
        for(int i = 1 ; i<= N ; ++i )
            if(sol[i])printf("%d\n" , i);
    }