比赛 20150423 评测结果 AAWTTTTTTTTTTTT
题目名称 马拉松2 最终得分 13
用户昵称 Satoshi 运行时间 12.002 s
代码语言 C++ 内存使用 1.28 MiB
提交时间 2015-04-23 11:00:00
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
ifstream in("marathonb.in");
ofstream out("marathonb.out");
int skip[501][501]={0},T,n;
int f[501]={0};
bool l[501]={0};
long long best=9999999,ans=0;
class node
{
public:
	int x,y;
}po[501]={0};
int disa(node a,node b)
{
	int s=0;
	s=abs(a.x-b.x);
	s+=abs(a.y-b.y);
	return s;
}
void print()
{
	int i;
	for(i=1;i<=n;i++)out<<f[i]<<' ';
	out<<endl;
}
void check()
{
	int i,j;
	vector<int> q;
	long long ans2=0;
	for(i=1;i<=n;i++)if(f[i]==0)q.push_back(i);
	for(i=0;i<q.size()-1;i++)ans2+=skip[q[i]][q[i+1]];
	if(ans2<best)best=ans2;
}
void check2()
{
	int i;
	long long ans2=0;
	vector<int> q;
	q.push_back(1);
	for(i=2;i<=n-1;i++)if(f[i])q.push_back(i);
	q.push_back(n);
	for(i=0;i<q.size()-1;i++)
	{
		ans2+=skip[i][i+1];
	}
	if(ans2<best)best=ans2;
}
int dfs(int sum,int data)
{
	int i;
	//out<<T<<' ';
	if(data==T)
	{
		//print();
		check();
		return 0;
	}
	if(sum==n)return 0; 
	f[sum]=1;
	dfs(sum+1,data+1);
	f[sum]=0;
	dfs(sum+1,data);
	return 0;
}
int bfs(int sum,int data)
{
	int i;
	//out<<sum<<' '<<data<<endl;
	//out<<T<<' ';
	//out<<n-T<<endl;
	if(data==n-T)
	{
		//print();
		check2();
		return 0;
	}
	if(sum==n)return 0; 
	f[sum]=1;
	//out<<sum<<endl;
	bfs(sum+1,data+1);
	f[sum]=0;
	bfs(sum+1,data);
	return 0;
}
int main()
{
	int i,j,k;
	in>>n>>T;
	for(i=1;i<=n;i++)in>>po[i].x>>po[i].y;
	for(i=1;i<=n-1;i++)
	{
		for(j=i+1;j<=n;j++)
		{
			skip[i][j]=disa(po[i],po[j]);
			skip[j][i]=disa(po[i],po[j]);
		}
	}
	//out<<k<<endl;
	if(T==n-2)
	{
		out<<skip[1][n]<<endl;
		return 0;
	}
	if(T<n-T)dfs(2,0);
	for(i=1;i<=n;i++)f[i]=0;
	if(T>=n-T)bfs(2,2);
	out<<best<<endl;
	return 0;
}