首页 > 代码库 > 爆搜解hdu1572下沙小面的(2)

爆搜解hdu1572下沙小面的(2)

#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
int cnt,ans,n,a[7],vis[1010],g[1010][1010];
void in()
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cin>>g[i][j];
	cin>>n;
	cnt=0;
	memset(vis,0,sizeof(vis));
	while(n--)
	{
		cin>>a[cnt];
		if(!vis[a[cnt]])
		{
			vis[a[cnt]]=1;
			cnt++;
		}
	}
	ans=10000;
	memset(vis,0,sizeof(vis));
}
void dfs(int s,int w,int step)
{
	if(step==cnt)
	{
		ans=min(ans,w);
		return;
	}
	for(int i=0;i<cnt;i++)
	{
		if(!vis[a[i]])
		{
			vis[a[i]]=1;
			dfs(a[i],w+g[s][a[i]],step+1);
			vis[a[i]]=0;
		}
	}
}
int main()
{
	while(cin>>n&&n!=0)
	{
		in();
		dfs(0,0,0);
		cout<<ans<<endl;
	}
}