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