Cod sursa(job #345158)

Utilizator freak93Adrian Budau freak93 Data 1 septembrie 2009 21:50:15
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<algorithm>

using namespace std;

const char iname[]="amenzi.in";
const char oname[]="amenzi.out";
const int maxn=152;
const int tmax=3500;

ifstream f(iname);
ofstream g(oname);

int a[tmax][maxn];

struct nod
{
    int w;
    int m;
};

vector<nod> E[maxn];

vector<nod> amenzi[maxn];
vector<nod>::iterator IT[maxn];

int n,m,i,j,t,k,p;

bool operator<(const nod& x, const nod& y)
{
    return x.w < y.w;
}

bool operator==(const nod& x,const nod& y)
{
    return x.w==y.w;
}

int main()
{
    f>>n>>m>>k>>p;

    //facem graful
    int x,y,z;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>z;
        nod r;
        r.w=y;
        r.m=z;
        E[x].push_back(r);
        r.w=x;
        E[y].push_back(r);
    }

    //facem amenzile
    for(i=1;i<=k;++i)
    {
        f>>x>>y>>z;
        nod r;
        r.w=y;
        r.m=z;
        amenzi[x].push_back(r);
    }

    for(i=1;i<=n;++i)
        sort(amenzi[i].begin(),amenzi[i].end());

    //initializam matricea
    memset(a,-1,sizeof(a));

    //initializam IT
    for(i=1;i<=n;++i)
        IT[i]=amenzi[i].begin();

    //calculam matricea
    vector<nod>::iterator it;
    a[0][1]=0;
    for(t=0;t<=tmax;++t)
    {
        for(i=1;i<=n;++i)
        {
            if(t>0)
                if(a[t-1][i]!=-1&&a[t-1][i]>a[t][i])
                    a[t][i]=a[t-1][i];
            if(a[t][i]==-1)
                continue;
            while(IT[i]!=amenzi[i].end()&&IT[i]->w<t)
                ++IT[i];
            while(IT[i]!=amenzi[i].end()&&IT[i]->w==t)
                a[t][i]+=IT[i]->m,++IT[i];
            if(a[t][i]>-1)
                for(it=E[i].begin();it!=E[i].end();++it)
                    if(t+it->m<=tmax)
                        if(a[t+it->m][it->w]==-1||a[t+it->m][it->w]<a[t][i])
                            a[t+it->m][it->w]=a[t][i];
        }
    }

    //rezultatele

    for(i=1;i<=p;++i)
    {
        f>>x>>y;
        g<<max(a[y][x],0)<<"\n";
    }

    f.close();
    g.close();
    return 0;
}