Cod sursa(job #794644)

Utilizator mipsPavel Mircea mips Data 6 octombrie 2012 18:42:09
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <cstdio>
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
vector<int> adj[4000];
int x[4000],y[4000],z[4000];
int cost[4000];
bool finished[4000];
int t;
int n;


void dfs(deque<int>& dq,int node)
{
    finished[node] = true;
    for (int i=0; i<adj[node].size(); i++)
    {
        if (!finished[adj[node][i]])
        {
            dfs(dq,adj[node][i]);
        }
    }
    dq.push_front(node);
}

deque<int> toporder()
{
    deque<int> order;
    for (int i=0; i<n; i++)
        if (!finished[i])
        {
            dfs(order,i);
        }
    return order;
}


int main()
{

    fin >> n >> t;
    for (int tests=0; tests<t; tests++)
    {
        for (int i=0; i<n; i++)
        {
            fin >> x[i] >> y[i] >> z[i];
            adj[i].clear();
            finished[i] = false;
            cost[i] = 0;
        }

        for (int i=0; i<n; i++)
            for (int j=0; j<n; j++)
                if (x[i] < x[j] && y[i] < y[j] && z[i] <z[j] )
                {
                    adj[i].push_back(j);
                }


        deque<int> ord = toporder();
        int maxTotal = 0;
        //cout << "top order"<<endl;
        while (ord.size())
        {
            //cout << ord.front()<< "  " <<endl;
            for (int i=0; i<adj[ord.front()].size(); i++)
            {
                cost[adj[ord.front()][i]] = max(cost[adj[ord.front()][i]] , cost[ord.front()]+1);
                maxTotal = max(maxTotal, cost[adj[ord.front()][i]]);
            }
            ord.pop_front();
        }
        //cout << "max:"<<endl;
        fout << maxTotal+1<<endl;



    }


}