题目链接:【hdu 4284】
一、floyd+dfs
<span style="font-size:14px;">#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define inf 0x3f3f3f3f
struct T
{
int id, ci, di;
}p[110];
int f[110][110], vis[110], h;
bool dfs(int li, int money, int num)
{
if(num==h)
{
if(money-f[li][1]>0) return true;
else return false;
}
for(int i=1; i<=h; i++)
{
int ans=money-f[li][p[i].id]-p[i].di;
if(vis[i]==0&&ans>=0)
{
vis[i]=1;
if(dfs(p[i].id, money-f[li][p[i].id]-p[i].di+p[i].ci, num+1)) return true;
vis[i]=0;
}
}
return false;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, m, money;
scanf("%d%d%d", &n, &m, &money);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j) f[i][j]=0;
else f[i][j]=inf;
}
}
for(int i=1; i<=m; i++)
{
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
f[u][v]=f[v][u]=min(f[u][v], c);//考虑重边
}
scanf("%d", &h);
for(int i=1; i<=h; i++)
{
scanf("%d%d%d", &p[i].id, &p[i].ci, &p[i].di);
}
for(int k=1; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
f[i][j] = min(f[i][j], f[i][k]+f[k][j]);
}
}
}
memset(vis, 0, sizeof(vis));
if(dfs(1, money, 0)) printf("YES\n");
else printf("NO\n");
}
return 0;
} </span>
二、状压dp
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define inf 0x3f3f3f3f
struct T
{
int id, ci, di;
}p[110];
int f[110][110], h, dp[(1<<16)+10][30];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, m, money;
memset(dp, -1, sizeof(dp));
scanf("%d%d%d", &n, &m, &money);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j) f[i][j]=0;
else f[i][j]=inf;
}
}
for(int i=1; i<=m; i++)
{
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
f[u][v]=f[v][u]=min(f[u][v], c);//考虑重边
}
for(int k=1; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
f[i][j] = min(f[i][j], f[i][k]+f[k][j]);
}
}
}
scanf("%d", &h);
for(int i=0; i<h; i++)
{
scanf("%d%d%d", &p[i].id, &p[i].ci, &p[i].di);
int mm=money-f[1][p[i].id]-p[i].di;
if(mm>=0) dp[1<<i][i]=mm+p[i].ci;
}
int st=1<<h;
for(int i=1; i<st; i++)
{
for(int j=0; j<h; j++)
{
if(dp[i][j]==-1) continue;
for(int k=0; k<h; k++)
{
if(i&(1<<k)) continue;
int mm=dp[i][j]-f[p[j].id][p[k].id]-p[k].di;
if(mm>=0) dp[i|(1<<k)][k]=max(dp[i|(1<<k)][k], mm+p[k].ci);
}
}
}
int mm=-1;
for(int i=0; i<h; i++)
{
mm=max(dp[st-1][i]-f[p[i].id][1], mm);
}
if(mm==-1) printf("NO\n");
else printf("YES\n");
}
return 0;
}