• poj 3026 Borg Maze


    BFS+prim

    在prim之前很暴力地求出各点之间距离。

    要注意只有在A和S处可以分开,题目有描述。

    读取x和y后要用gets读取换行符。

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #define MAXD 51
    #define INF 0x3f3f3f3f
    using namespace std;
    int N,graph[MAXD][MAXD],dis[MAXD][MAXD],a[MAXD*2][2],x,y,cost[MAXD*2][MAXD*2],e;
    char data[MAXD][MAXD];
    
    int dir[][2]={{-1,0},{0,1},{1,0},{0,-1}};
    void BFS(int src_x,int src_y)
    {
        memset(dis,0x3f,sizeof(dis));
        dis[src_x][src_y]=0;
        bool vis[MAXD][MAXD];
        memset(vis,0,sizeof(vis));
        vis[src_x][src_y]=true;
        queue<int> que;
        que.push(x*src_x+src_y);
        int cur,cur_x,cur_y,next,next_x,next_y,i;
        while(!que.empty())
        {
            cur=que.front();
            cur_x=cur/x;
            cur_y=cur%x;
            que.pop();
            for(i=0;i<4;i++)
            {
                next_x=cur_x+dir[i][0];
                next_y=cur_y+dir[i][1];
                next=next_x*x+next_y;
                if(next_x<0||next_x>=y||next_y<0||next_y>=x)
                continue;
                if(!graph[next_x][next_y]&&!vis[next_x][next_y])
                {
                   vis[next_x][next_y]=true;
                   dis[next_x][next_y]=dis[cur_x][cur_y]+1;
                   que.push(next);
                }
            }
        }
    }
    
    void getcost(int cur)
    {
        int i;
        for(i=0;i<=e;i++)
        {
            if(cur==i)
            continue;
            cost[cur][i]=dis[a[i][0]][a[i][1]];
        }
    }
    
    int MST_PRIM()
    {
        int key[MAXD*2];
        memset(key,0x3f,sizeof(key));
        key[0]=0;
        bool vis[MAXD*2];
        memset(vis,0,sizeof(vis));
        vis[0]=true;
        int i,j;
        for(i=0;i<=e;i++)
        key[i]=cost[0][i];
        int flag,p,res=0;
        for(i=1;i<=e;i++)
        {
            flag=INF,p=-1;
            for(j=0;j<=e;j++)
            {
                if(!vis[j]&&flag>key[j])
                {
                    flag=key[j];
                    p=j;
                }
            }
            vis[p]=true;
            res+=flag;
            for(j=0;j<=e;j++)
            {
                if(!vis[j]&&key[j]>cost[p][j])
                key[j]=cost[p][j];
            }
        }
        return res;
    }
    int main()
    {
        //freopen("test.txt","r",stdin);
        scanf("%d",&N);
        int t=N;
        while(t--)
        {
            int i,j;
            cin >> x >> y;
            char temp[MAXD];
            gets(temp); //需要用gets吃掉cin留下来的换行符
            e=0;
            memset(graph,0,sizeof(graph));
            for(i=0;i<y;i++)
            {
                gets(data[i]);
                for(j=0;j<x;j++)
                {
                    if(data[i][j]=='#')
                    graph[i][j]=1;
                    if(data[i][j]=='S')
                    {
                        a[0][0]=i;
                        a[0][1]=j;
                    }
                    if(data[i][j]=='A')
                    {
                        e++;
                        a[e][0]=i;
                        a[e][1]=j;
                    }
                }
            }
            memset(cost,0,sizeof(cost));
            for(i=0;i<=e;i++)
            {
                BFS(a[i][0],a[i][1]);
                getcost(i);
            }
            printf("%d\n",MST_PRIM());
        }
        return 0;
    }
  • 相关阅读:
    排序简介
    排序集锦
    排序图解
    UVA 11809
    uva1588kickdown
    C++中输入输出的重定向
    uva1587BOX
    uva 10340 All in All
    uva 1368 DNA Consensus String
    彻底理解MapReduce shuffle过程原理
  • 原文地址:https://www.cnblogs.com/longlongagocsu/p/2871911.html
Copyright © 2020-2023  润新知