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;
}