//2156MS 4464K
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF = 0x7fffffff;
int n,m,money;
int dis[105][105];
int dp[1<<16][16];
struct node{
int id;
int l;
int c;
}a[20];
void init_dis(){
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
dis[i][j] = (i == j) ? 0 : INF;
}
void Floyd(){
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
if(i != k && dis[i][k] != INF)
for(int j=1; j<=n; j++){
if(j != k && j != i && dis[k][j] != INF)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
}
void DP(){
memset(dp,-1,sizeof(dp));
int temp;
scanf("%d",&temp);
for(int i=0;i<temp;i++){
scanf("%d%d%d",&a[i].id,&a[i].c,&a[i].l);
if(money >= dis[1][a[i].id]+a[i].l)
dp[1<<i][i]=money-dis[1][a[i].id]+a[i].c-a[i].l;
}
for(int i=0;i<(1<<temp);i++){
for(int j=0;j<temp;j++){
if(dp[i][j] >= 0 && ((i>>j) & 1))
for(int k=0;k<temp;k++){
if(k==j) continue;
if(i&(1<<k)) continue;
if(dp[i][j]<(a[k].l+dis[a[k].id][a[j].id])) continue;
dp[i|(1<<k)][k]=max(dp[i|(1<<k)][k],dp[i][j]-dis[a[j].id][a[k].id]+a[k].c-a[k].l);
}
}
}
bool ok=false;
for(int i=0;i<temp;i++){
if((dp[(1<<(temp))-1][i]-dis[a[i].id][1])>=0){
ok=true;
break;
}
}
if(ok) printf("YES\n");
else printf("NO\n");
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&m,&money);
init_dis();
for(int i=0; i<m; i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=dis[v][u]=min(dis[u][v],w);
}
Floyd();
DP();
}
return 0;
}
hdu 4284 Travel Floyd+TSP
最新推荐文章于 2019-08-17 12:14:34 发布