题目:给出一些城市,从1出发,旅游一圈回到1,由于花费可能不够,所以选择一些城市打工,打工之前需要花费d买一个证,工资为c。选中的城市必须去工作一次,而且只能工作一次,问能不能完成旅行
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int oo=1e8;
int g[110][110];
int a[110],c[110],d[110];
bool vis[110];
int h,ans,flag;
void dfs(int cur,int num,int coin)
{
if(flag) return;
if(num==h)
{
if(coin-g[cur][1]>=0)
{
flag=1;
}
return;
}
for(int i=0;i<h;i++)
{
int v=a[i],ret;
if(coin-g[cur][v]>=0&&coin-g[cur][v]-d[i]>=0&&!vis[v])
{
ret=coin+c[i]-d[i]-g[cur][v];
vis[v]=true;
if(ret>=0)
dfs(v,num+1,ret);
vis[v]=false;
}
}
}
int main()
{
int t,n,m,u,v,w,i,j,coin,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&coin);
memset(vis,false,sizeof(vis));
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
g[i][j]=oo;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(w<g[u][v]) g[u][v]=w;
if(w<g[v][u]) g[v][u]=w;
}
for(i=0;i<=n;i++)
g[i][i]=0;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(g[i][k]+g[k][j]<g[i][j])
g[i][j]=g[i][k]+g[k][j];
}
}
}
scanf("%d",&h);
int t1,t2,t3;
for(i=0;i<h;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
a[i]=t1,c[i]=t2,d[i]=t3;
}
flag=0;
dfs(1,0,coin);
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}