Cod sursa(job #1858093)

Utilizator topala.andreiTopala Andrei topala.andrei Data 27 ianuarie 2017 00:00:18
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("amenzi.in");
ofstream g("amenzi.out");
const int maxn=152;
vector <int>G[maxn],T[maxn];
const int inf=1<<30;
int dp[maxn][3502],a[maxn][3501];
int viz[maxn];
int N,M,K,P;
int main()
{
    int x,y,z,i,j,k,sz,next,timp;
    f>>N>>M>>K>>P;
    for (i=1;i<=M;i++)
    {
        f>>x>>y>>z;
        G[x].push_back(y);
        T[x].push_back(z);

        G[y].push_back(x);
        T[y].push_back(z);
    }
    for (i=1;i<=N;i++)
    {
        G[x].push_back(x);
        T[x].push_back(1);
    }
    for (i=1;i<=K;i++)
    {
        f>>x>>y>>z;
        a[x][y]=z;
    }
    memset(dp, -1, sizeof(dp));
    for (i=2;i<maxn;i++) viz[i]=inf;
    for (i=0;i<=3500;i++)
        for(j=1;j<=N;j++)
        {

            if (viz[j]>i) continue;
            viz[j]=0;
            sz=G[j].size();
            if (a[j][i]!=0)
                {if (dp[j][i]==-1) dp[j][i]=a[j][i];
                else dp[j][i]+=a[j][i];}
            for (k=0;k<sz;k++)
            {
                next=G[j][k];
                timp=T[j][k];
                if (i+T[j][k]<=3500)
                {
                    dp[next][i+timp]=max(dp[next][i+timp],dp[j][i]);
                    if (viz[next]!=0) viz[next]=min(viz[next],timp+i);
                }
            }
        }
    for (i=1;i<=P;i++)
    {
        f>>x>>y;
        g<<dp[x][y]<<"\n";
    }


}