POJ1062 昂贵的聘礼, ZOJ1245 Best Deal

dfs和最短路都可以做, 我用的是dfs, 最短路应该可以更短. 

一开始没有标记每个物品是否已经使用, WA和MLE了很久...


#ifdef _MSC_VER
#define DEBUG
#define _CRT_SECURE_NO_DEPRECATE
#endif

#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <numeric>
#include <functional>
#include <ctype.h>
#define MAX 101
using namespace std;

int map[MAX][MAX],value[MAX];
bool visit[MAX];
struct NODE
{
	int level,x;
	unsigned int goods[MAX][2];

	void get()
	{
		scanf("%d%d",&level,&x);
		for( int i=0;i<x;++i)
			scanf("%d%d",&goods[i][0],&goods[i][1]);
	}
}node[MAX];

int dfs(const int &x,const int &m,const  int &tmax,const  int &tmin)
{
	int ans=value[x];
  visit[x]=true;
  for( int i=1;i<MAX;++i)
		if(!visit[i] &&map[x][i] && abs(node[i].level-tmax)<=m && abs(node[i].level-tmin)<=m)
			ans=min(ans,map[x][i]+dfs(i,m,max(node[i].level,tmax),min(node[i].level,tmin)));
  visit[x]=false;
	return ans;
}

int main(void)
{
#ifdef DEBUG  
  freopen("../stdin.txt","r",stdin);
  freopen("../stdout.txt","w",stdout); 
#endif  

	int m,n;

	while(~scanf("%d%d",&m,&n))
	{
		memset(map,0,sizeof(map));
		memset(value,0,sizeof(value));
		memset(visit,false,sizeof(visit));

		for(int i=1;i<=n;++i)
		{
			scanf("%d",&value[i]);
			node[i].get();
		}

		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)
				if(i!=j && abs(node[i].level-node[j].level)<=m)
				{
					for( int k=0;k<node[i].x;++k)
						if(node[i].goods[k][0]==j)
							map[i][j]=node[i].goods[k][1];
				}
		int ans=dfs(1,m,node[1].level,node[1].level);
		printf("%d\n",ans);
	}

  return 0;
}


你可能感兴趣的:(POJ1062 昂贵的聘礼, ZOJ1245 Best Deal)