| 比赛 | 
    20120706 | 
    评测结果 | 
    ATTTTTEETA | 
    | 题目名称 | 
    排队 | 
    最终得分 | 
    20 | 
    | 用户昵称 | 
    Pom | 
    运行时间 | 
    0.000 s  | 
    | 代码语言 | 
    C++ | 
    内存使用 | 
    0.00 MiB  | 
    | 提交时间 | 
    2012-07-06 11:53:13 | 
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN=101;
const int oo=10000000;
int mat[MAXN][MAXN],i,h,j,re[MAXN],k,n,d[MAXN],ans=oo;
bool used[MAXN];
void dfs(int dep,int now)
{
	if (dep>n)
	{
		ans=min(ans,now);
		return;
	}
	for (int i=1;i<=n;i++)
		if (!used[i] && mat[re[dep-1]][i]+now<ans && d[i]-d[re[dep-1]]>-h)
		{
			used[i]=true;
			re[dep]=i;
			dfs(dep+1,now+mat[re[dep-1]][i]);
			used[i]=false;
		}
}
int main()
{
	freopen("queuea.in","r",stdin);
	freopen("queuea.out","w",stdout);
	scanf("%d%d",&n,&h);
	for (i=1;i<=n;i++)
		scanf("%d",&d[i]);
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			scanf("%d",&mat[i][j]);
	int MIN=1;
	for (i=1;i<=n;i++)
		if (d[i]<d[MIN]) MIN=i;
	used[MIN]=true;
	re[1]=MIN;
	dfs(2,0);
	printf("%d\n",ans);
	return 0;
}