Cod sursa(job #1321539)

Utilizator raztaapDumitru raztaap Data 19 ianuarie 2015 11:41:01
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 200
#define MAXK 12500
struct amenda{int t; int val; int intersectie;};
amenda AM[MAXK];
int a[MAXN][MAXN];
int n, m, k, p;
bool comp(amenda o, amenda p)
{
    if(o.t<p.t)
        return 1;
    else
        if(o.t==p.t)
            if(o.val>p.val)
                return 1;
    return 0;
}
void citire()
{
    int i, x, y, c;
    scanf("%d%d%d%d", &n, &m, &k, &p);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d", &x, &y, &c);
        a[x][y]=a[y][x]=c;
    }
    for(i=1;i<=k;++i)
        scanf("%d%d%d", &AM[i].intersectie, &AM[i].t, &AM[i].val);
    sort(AM+1, AM+k+1, comp);
}
void RF()
{
    int i, j, p;
    for(p=1;p<=n;++p)
        for(i=1;i<=n;++i)
            for(j=1;j<=n;++j)
                if(a[i][p]&&a[p][j]&&(a[i][j]>a[i][p]+a[p][j]||!a[i][j])&&i!=j)
                    a[i][j]=a[i][p]+a[p][j];
}
void calcul(int pi, int ti)
{
    int amd=0, timp=0;
    int cursor=1;
    int icurenta=1;
    while(cursor<=k)
    {
        if(a[icurenta][AM[cursor].intersectie]+timp<=AM[cursor].t&&AM[cursor].t+a[AM[cursor].intersectie][pi]<=ti)
        {
            amd+=AM[cursor].val;
            timp=AM[cursor].t;
            icurenta=AM[cursor].intersectie;
        }
        ++cursor;
    }
    printf("%d\n", amd);
}
void rezolva_problema()
{
    citire();
    RF();
    int i, pi, ti;
    for(i=1;i<=p;++i)
    {
        scanf("%d%d", &pi, &ti);
        calcul(pi, ti);
    }
}
int main()
{
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);
    rezolva_problema();
    return 0;
}