题目中要求只要两个村庄间的距离小于等于30就可以转移。而刚开始我以为这个人最多只能走30,转移的路超过30之后就不能再转移了。刚开始用的BFS,怎么写都超时。后来发现看错题了之后,果断换成了DFS,然后才AC。本来挺简单的一道,浪费了大半天的时间。。不过最后能过掉还是很开心的。。
#include <iostream>
#include <cstdio>
#include <stack>
#include <memory.h>
using namespace std;
struct Village
{
int x;
int y;
int monas;
};
bool visited [1005];
int calDistance(Village a,Village b);
int main()
{
int num;
Village vill[1001];
while(cin>>num && num)
{
int imax=0;
int res=0;
for(int i=0; i<num; i++)
{
scanf("%d %d %d",&vill[i].x,&vill[i].y,&vill[i].monas);
}
stack <Village> S;
Village tmp;
for(int i=0; i<num; i++)
{
memset(visited,0,sizeof(visited));
visited[i]=1;
S.push(vill[i]);
int ans[1001]= {0};
ans[i]+=vill[i].monas;
while(!S.empty())
{
tmp=S.top();
bool flag=0;
for(int j=0; j<num; j++)
{
if(calDistance(vill[j],tmp)<=900&&visited[j]==0)
{
visited[j]=1;
S.push(vill[j]);
ans[i]+=vill[j].monas;
flag=1;
}
}
if(!flag)S.pop();
}
if(res<ans[i])
{
res=ans[i];
imax=i;
}
}
printf("%d %d\n",imax+1,res);
}
}
int calDistance(Village a,Village b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}