HOJ 2064 Journey to Tibet (DFS)

题目中要求只要两个村庄间的距离小于等于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);
}


你可能感兴趣的:(HOJ 2064 Journey to Tibet (DFS))