Pagini recente » Cod sursa (job #1189733) | Cod sursa (job #1559068) | Cod sursa (job #1056717) | Cod sursa (job #746334) | Cod sursa (job #345158)
Cod sursa(job #345158)
#include<fstream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const char iname[]="amenzi.in";
const char oname[]="amenzi.out";
const int maxn=152;
const int tmax=3500;
ifstream f(iname);
ofstream g(oname);
int a[tmax][maxn];
struct nod
{
int w;
int m;
};
vector<nod> E[maxn];
vector<nod> amenzi[maxn];
vector<nod>::iterator IT[maxn];
int n,m,i,j,t,k,p;
bool operator<(const nod& x, const nod& y)
{
return x.w < y.w;
}
bool operator==(const nod& x,const nod& y)
{
return x.w==y.w;
}
int main()
{
f>>n>>m>>k>>p;
//facem graful
int x,y,z;
for(i=1;i<=m;++i)
{
f>>x>>y>>z;
nod r;
r.w=y;
r.m=z;
E[x].push_back(r);
r.w=x;
E[y].push_back(r);
}
//facem amenzile
for(i=1;i<=k;++i)
{
f>>x>>y>>z;
nod r;
r.w=y;
r.m=z;
amenzi[x].push_back(r);
}
for(i=1;i<=n;++i)
sort(amenzi[i].begin(),amenzi[i].end());
//initializam matricea
memset(a,-1,sizeof(a));
//initializam IT
for(i=1;i<=n;++i)
IT[i]=amenzi[i].begin();
//calculam matricea
vector<nod>::iterator it;
a[0][1]=0;
for(t=0;t<=tmax;++t)
{
for(i=1;i<=n;++i)
{
if(t>0)
if(a[t-1][i]!=-1&&a[t-1][i]>a[t][i])
a[t][i]=a[t-1][i];
if(a[t][i]==-1)
continue;
while(IT[i]!=amenzi[i].end()&&IT[i]->w<t)
++IT[i];
while(IT[i]!=amenzi[i].end()&&IT[i]->w==t)
a[t][i]+=IT[i]->m,++IT[i];
if(a[t][i]>-1)
for(it=E[i].begin();it!=E[i].end();++it)
if(t+it->m<=tmax)
if(a[t+it->m][it->w]==-1||a[t+it->m][it->w]<a[t][i])
a[t+it->m][it->w]=a[t][i];
}
}
//rezultatele
for(i=1;i<=p;++i)
{
f>>x>>y;
g<<max(a[y][x],0)<<"\n";
}
f.close();
g.close();
return 0;
}