Cod sursa(job #1858087)

Utilizator topala.andreiTopala Andrei topala.andrei Data 26 ianuarie 2017 23:48:58
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 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][3052];
int viz[maxn];
int N,M,K,P;
int main()
{
    int x,y,z,i,j,k,sz;
    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;
            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++)
                if (i+T[j][k]<=3500) {dp[G[j][k]][i+T[j][k]]=max(dp[G[j][k]][i+T[j][k]],dp[j][i]);viz[G[j][k]]=min(viz[G[j][k]],T[j][k]+i);}
        }
    for (i=1;i<=P;i++)
    {
        f>>x>>y;
        g<<dp[x][y]<<" ";
    }


}