Cod sursa(job #1232012)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 21 septembrie 2014 21:13:12
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("amenzi.in");
ofstream g("amenzi.out");
int N,M,K,P;
vector <int> G[155];
vector <int> Cost[155];
int cost[155][3505],DP[155][3505];
void Read()
{
    int i;
    f>>N>>M>>K>>P;
    for(i=1;i<=M;i++)
    {
        int x,y,c;
        f>>x>>y>>c;
        G[x].push_back(y);
        G[y].push_back(x);
        Cost[x].push_back(c);
        Cost[y].push_back(c);
    }
    for(int i=1;i<=K;i++)
    {
        int point,c,time;
        f>>point>>time>>c;
        cost[point][time]=c;
    }
}

void DFS(int node,int time)
{
    if(time<0)
        return;
    if(DP[node][time]!=-1000000000 && DP[node][time]!=-1000000001)
        return;
    for(int i=0;i<G[node].size();i++)
    {
        int neighbour=G[node][i];
        int c=Cost[node][i];
        DFS(neighbour,time-c);
        if(time>=c)
            DP[node][time]=max(DP[node][time],DP[neighbour][time-c]+cost[node][time]);
    }
    if(DP[node][time]==-1)
        DP[node][time]=-1000000001;
}
void Browse()
{
    for(int i=1;i<=N;i++)
        for(int j=0;j<=3500;j++)
            DP[i][j]=-1000000000;
    DP[1][0]=0;
    for(int i=1;i<=N;i++)
    {
        int x;
        x=0;
        for(int j=0;j<=3500;j++)
            DFS(i,j);
    }

    for(int i=1;i<=P;i++)
    {
        int x,y;
        f>>x>>y;
        DP[x][y]=max(DP[x][y],0);
        g<<DP[x][y]<<"\n";
    }
}
int main()
{
    Read();
    Browse();
    return 0;
}