Cod sursa(job #726697)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 27 martie 2012 13:50:34
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <stack>
#include <vector>
#include <algorithm>
#include <cstring>
#define MAXN 3510
using namespace std;
stack<int>S;
vector<int>C[MAXN];
bool viz[MAXN],a[MAXN][MAXN];
int lmax[MAXN],n,m,s[MAXN],sol,prev[MAXN],t;

bool incape(int x,int y)
{
    for(int i=0;i<C[x].size();i++) if(C[x][i]<C[y][i]) return 0;
    return 1;
}
void dfs(int x)
{
    viz[x]=1;
    for(int i=1;i<=n;i++)
    if(a[x][i] and !viz[i]) dfs(i);
    S.push(x);
}
int main()
{
    int i,j,x;
	ifstream fi("cutii.in");
	ofstream fo("cutii.out");
	fi>>n>>t;
	for (;t;--t) {
	    memset(a,0,sizeof(a));memset(lmax,0,sizeof(lmax));memset(viz,0,sizeof(viz));
        for(j=1;j<=n;j++)
        {
            C[j].clear();
            fi>>x;
            C[j].push_back(x);
            fi>>x;
            C[j].push_back(x);
            fi>>x;
            C[j].push_back(x);
        }



    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        if(incape(i,j)) a[i][j]=1;
    }

    for(i=1;i<=n;i++)
    if(!viz[i]) dfs(i);
    m=0;
    while(!S.empty())
    {
        s[++m]=S.top();
        S.pop();
    }

    for(i=1;i<=m;i++)
    {
        lmax[i]=1;
        for(j=1;j<i;j++)
        if(a[s[j]][s[i]] and lmax[j]+1>lmax[i]) { lmax[i]=lmax[j]+1; prev[i]=j; }
        if(lmax[i]>lmax[sol]) sol=i;
    }
    fo<<lmax[sol]<<"\n";
	}
    fo<<"\n";
    return 0;
}