Pagini recente » Cod sursa (job #2027112) | Cod sursa (job #1562386) | Cod sursa (job #3153438) | Cod sursa (job #2030884) | Cod sursa (job #2155856)
#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;
}