Cod sursa(job #2155856)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 8 martie 2018 10:48:38
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 1<<20
#define nmax 155
#define x first
#define y second
#define intervalmax 3505

ifstream f("amenzi.in");
ofstream g("amenzi.out");

// BRUTE BACKTRACK O(k! + N^3)


/*struct str
{
    int vecin,cost;
};*/

struct str2
{
    int moment,nod,val;
};

bool cmp(str2 a,str2 b)
{
    return a.moment<b.moment;
}

/*vector<str>Q[nmax];*/
vector<str2>amenzi;
vector<pair<int,int>>query;

int n,m,k,p,cost[nmax][nmax],bestcost[nmax][nmax];
int bestamenda;

void read()
{
    f>>n>>m>>k>>p;
    for (int i=1; i<=n; ++i)
        for (int j=1; j<=n; ++j)
            cost[i][j]=inf;
    for (int i=1; i<=m; ++i)
    {
        int e1,e2,e3;
        f>>e1>>e2>>e3;
        cost[e1][e2]=cost[e2][e1]=e3;
    }
    for (int i=1; i<=k; ++i)
    {
        int e1,e2,e3;
        f>>e1>>e2>>e3;
        amenzi.push_back({e2,e1,e3});
    }
    for (int i=1; i<=p; ++i)
    {
        int e1,e2;
        f>>e1>>e2;
        query.push_back({e1,e2});
    }
}

void floyd_warshall()
{
    for (int i=1; i<=n; ++i)
        cost[i][i]=0;
    for (int k=1; k<=n; ++k)
        for (int i=1; i<=n; ++i)
            for (int j=1; j<=n; ++j)
                cost[i][j]=cost[j][i]=min(cost[j][i],cost[i][k]+cost[k][j]);
}

void bk(int nodcurent,int lastindiceamenda,int momcurent,int intal,int momintal,int costcurent)
{
    bestamenda=max(bestamenda,costcurent);
    for (int i=lastindiceamenda+1; i<=k; ++i)
    {
        int nextmom=amenzi[i-1].moment;
        int nextnod=amenzi[i-1].nod;
        if (momcurent+cost[nodcurent][nextnod]<=nextmom)
        {
            int nextval=amenzi[i-1].val;
            if (nextmom+cost[nextnod][intal]<=momintal)
                bk(nextnod,i,nextmom,intal,momintal,costcurent+nextval);
        }
    }
}

void solve()
{
    floyd_warshall();
    sort(amenzi.begin(),amenzi.end(),cmp);
    for (auto w:query)
    {
        int intal=w.x;
        int momintal=w.y;
        bestamenda=0;
        bk(1,0,0,intal,momintal,0);
        g<<bestamenda<<'\n';
    }
}

int main()
{
    read();
    solve();
    return 0;
}