您的位置:首页 > 其它

hdu 4284Travel(状压dp 或 floyd+dfs)

2015-12-11 20:32 316 查看
题目链接:【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: