码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2612 (BFS搜索+多终点)

时间:2014-10-19 21:15:18      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   io   os   ar   for   strong   sp   

题目链接http://poj.org/problem?id=1947

题目大意:两人选择图中一个kfc约会。问两人到达时间之和的最小值。

解题思路

对于一个KFC,两人的BFS目标必须一致。

于是就有以下的SB行为:记录所有KFC,对于每个KFC,对两人BFS。然后你就会看见红红的TLE。

实际上,只需要两次BFS就可以了,用time_k[0][i]记录a同学到达第i个kfc的时间,time_k[1][i]记录b同学到达第i个kfc的时间。

在一次bfs过程中,记录到达所有kfc的时间。

本题有个不严谨的地方,就是没有说明不被选择的kfc是相当于road还是障碍,我是当成road算的。

由于图中有些kfc是不能到达的,所以time_k数组初始化为inf,防止不能到达的kfc扰乱结果。

最后ans=min(ans,time_k[0][i]+time_k[1][i])。

 

#include "cstdio"
#include "cstring"
#include "string"
#include "iostream"
#include "queue"
#include "vector"
using namespace std;
#define inf 0x3f3f3f3f
int n,m,sx,sy,ssx,ssy,ex,ey,dir[4][2]={-1,0,1,0,0,-1,0,1},vis[205][205],ans,cnt,kfc[205][205],time_k[2][205*205];
char map[205][205];
struct status
{
    int x,y,dep;
    status(int x,int y,int dep):x(x),y(y),dep(dep) {}
};
void bfs(int x,int y,int p)
{
    memset(vis,0,sizeof(vis));
    queue<status> Q;
    Q.push(status(x,y,0));
    vis[x][y]=true;
    while(!Q.empty())
    {
        status t=Q.front();Q.pop();
        for(int s=0;s<4;s++)
        {
            int X=t.x+dir[s][0],Y=t.y+dir[s][1];
            if(X<1||X>n||Y<1||Y>m||map[X][Y]==#||vis[X][Y]) continue;
            vis[X][Y]=true;
            if(map[X][Y]==@) time_k[p][kfc[X][Y]]=t.dep+1;
            Q.push(status(X,Y,t.dep+1));
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    ios::sync_with_stdio(false);
    string tt;
    while(cin>>n>>m)
    {
        memset(time_k,0x3f,sizeof(time_k));
        ans=inf,cnt=0;
        for(int i=1;i<=n;i++)
        {
            cin>>tt;
            for(int j=0;j<tt.size();j++)
            {
                map[i][j+1]=tt[j];
                if(tt[j]==Y) {sx=i;sy=j+1;}
                if(tt[j]==M) {ssx=i;ssy=j+1;}
                if(tt[j]==@) {kfc[i][j+1]=++cnt;}
            }
        }
        bfs(sx,sy,0);bfs(ssx,ssy,1);
        for(int i=1;i<=cnt;i++) ans=min(ans,(time_k[0][i]+time_k[1][i])*11);
        cout<<ans<<endl;
    }
}

 

11915289 2014-10-19 20:15:30 Accepted 2612 15MS 996K 1596 B C++ Physcal

HDU 2612 (BFS搜索+多终点)

标签:style   http   color   io   os   ar   for   strong   sp   

原文地址:http://www.cnblogs.com/neopenx/p/4035410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!