#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<set>
#define inf 1000000000
#define pi acos(-1.0)
#define eps 1e-8
#define seed 131
using namespace std;
typedef pair<int,int> pii;
typedef unsigned long long ULL;
typedef long long LL;
const int maxn=100005;
int n,m,money,h;
int dis[105][105];
int num[105][2];
int dp[105][1<<16];
int pn[105];
void floyed();
void tsp();
int main()
{
int t;
scanf("%d",&t);
int a,b,w;
int e;
while(t--)
{
scanf("%d%d%d",&n,&m,&money);
memset(dis,0,sizeof(dis));
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
dis[i][j]=dis[j][i]=inf;
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&w);
dis[a][b]=dis[b][a]=min(w,dis[a][b]);
}
floyed();
scanf("%d",&h);
memset(num,-1,sizeof(num));
memset(pn,-1,sizeof(pn));
int id,c,d;
e=0;
for(int i=0;i<h;i++)
{
scanf("%d%d%d",&id,&c,&d);
num[id][0]=c;num[id][1]=d;
pn[e++]=id;
}
sort(pn,pn+e);
memset(dp,-1,sizeof(dp));
for(int i=0;i<e;i++)
{
if(money-dis[1][pn[i]]-num[pn[i]][1]>=0)
{
dp[i][1<<i]=money-dis[1][pn[i]]-num[pn[i]][1]+num[pn[i]][0];//TSP问题的边界值
}
}
tsp();
bool flag=false;
int goal=(1<<h)-1;
for(int i=0;i<h;i++)
{
if(dp[i][goal]>=dis[pn[i]][1])
{
flag=true;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
void floyed()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][k]!=inf&&dis[k][j]!=inf)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
void tsp()
{
for(int s=0;s<(1<<h);s++)
{
for(int i=0;i<h;i++)
{
if((1<<i)&s)
{
for(int k=0;k<h;k++)
{
if(k==i||!((1<<k)&s))
continue;
if(dp[k][s^(1<<i)]-dis[pn[k]][pn[i]]>=0)
{
if(dp[k][s^(1<<i)]-dis[pn[k]][pn[i]]>=num[pn[i]][1])
dp[i][s]=max(dp[i][s],dp[k][s^(1<<i)]-dis[pn[k]][pn[i]]+num[pn[i]][0]-num[pn[i]][1]);
}
}
}
}
}
}
hdu4284 Realtime Status 状压dp TSP问题 最短路
最新推荐文章于 2019-08-17 12:14:34 发布