Cod sursa(job #24410)

Utilizator mariusdrgdragus marius mariusdrg Data 2 martie 2007 11:36:16
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include<stdio.h>
#include<vector>

using namespace std;

const int maxn = 151;
const int maxn2 = 3501;
const int inf = 1000000000;


vector<int> vect[maxn];
vector<int> vect2[maxn];
vector<int> vectt[maxn2];
vector<int> vectt2[maxn2];


int a[maxn2][maxn];
int n;
int m;
int k;
int p;
int x,y,c;
int i,j;

int max(int a,int b)
{
        if (a<b) return b;
        return a;
}


int main()
{
        freopen("amenzi.in","r",stdin);
        freopen("amenzi.out","w",stdout);
        scanf("%d %d %d %d",&n,&m,&k,&p);
        for(i=1;i<=m;i++)
        {
                scanf("%d %d %d",&x,&y,&c);
                vect[x].push_back(y);
                vect2[x].push_back(c);
                vect[y].push_back(x);
                vect2[y].push_back(c);
        }
        for(i = 1;i <= k ; ++i)
        {
                scanf("%d %d %d",&x,&y,&c);
                vectt[y].push_back(x);
                vectt2[y].push_back(c);
        }
        for(i = 0;i <= n ; ++i)
                for(j = 0; j <= 3500 ; ++j)
                {
                        a[j][i]=-inf;
                }
        a[0][1] = 0;
        for(i = 0; i <= 3500; ++i)
        {
                vector <int> :: iterator it;
                vector <int> :: iterator it2;
                for(it2 = vectt2[i].begin(), it = vectt[i].begin(); it != vectt[i].end(); ++it2, ++it)
                {
                        if (a[i][*it] >= 0) a[i][*it] += *it2;
                }
                for(j = 1; j<= n; ++j)
                {
                        vector <int> :: iterator it;
                        vector <int> :: iterator it2;
                        if (a[i][j] < 0) continue;
                        for(it2 = vect2[j].begin(),it = vect[j].begin(); it != vect[j].end(); ++it2, ++it)
                        {
                                int x = i + *it2;
                                if (x <= 3500) a[x][*it] = max(a[i][j],a[x][*it]);
                        }
                }
        }
        for(i = 1; i <= p; ++i)
        {
                scanf("%d %d",&x,&y);
                if (a[y][x]>0)printf("%d\n",a[y][x]);
                        else printf("-1\n");
        }

        return 0;
}