• poj3026Borg Maze(bfs+MST)


    http://poj.org/problem?id=3026

    BFS求出任意两个A或A和S的最短距离 然后最小生成树求和

    把所有A和S存起来求BFS任意两点 搜超时了 之后改了改过了

    View Code
      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<queue>
      6 using namespace std;
      7 #define INF 0x3f3f3f
      8 struct node
      9 {
     10     int x,y,num;
     11 }al[110];
     12 char str[60][60];
     13 int f[60][60],dir[4][2]={0,1,0,-1,1,0,-1,0},n,m,w[110][110],visit[110],low[110],sum,ff[110][110];
     14 int judge(int i,int j)
     15 {
     16     if(i<1||i>n||j<1||j>m)
     17     return 0;
     18     if(str[i][j]=='#')
     19     return 0;
     20     return 1;
     21 }
     22 void bfs(int x,int y)
     23 {
     24     int i,j;
     25     queue<node>q;
     26     memset(f,0,sizeof(f));
     27     struct node st;
     28     st.x =x;
     29     st.y =y;
     30     f[st.x][st.y] = 1;
     31     st.num = 0;
     32     q.push(st);
     33     while(!q.empty())
     34     {
     35         struct node mt = q.front();
     36         int tx = mt.x;
     37         int ty = mt.y;
     38         int tnum = mt.num;
     39         q.pop();
     40         if(str[tx][ty]=='S'||str[tx][ty]=='A')
     41         {
     42             w[ff[x][y]][ff[tx][ty]] = tnum;
     43         }
     44         for(i = 0; i <= 3 ;i++)
     45         {
     46             int ti = dir[i][0]+tx;
     47             int tj = dir[i][1]+ty;
     48             if(!f[ti][tj]&&judge(ti,tj))
     49             {
     50                 f[ti][tj] = 1;
     51                 st.x = ti;
     52                 st.y = tj;
     53                 st.num = tnum+1;
     54                 q.push(st);
     55             }
     56         }
     57     }
     58 }
     59 void Prime(int n)
     60 {
     61      int i,j,k;
     62      memset(visit,0,sizeof(visit));
     63      visit[1] = 1;
     64      for(i = 2 ;i <= n ; i++)
     65          low[i] = w[1][i];
     66      for(i = 1 ; i <= n ; i++)
     67      {
     68          int max = INF;
     69          for(j = 1 ; j <= n ; j++)
     70              if(!visit[j]&&max>low[j])
     71                  max = low[k=j];
     72          if(max == INF)
     73              break;
     74          visit[k] = 1;
     75          sum+=max;
     76          for(j = 1 ; j <= n ; j++)
     77              if(!visit[j]&&low[j]>w[k][j])
     78              low[j] = w[k][j];
     79      }
     80 }
     81 int main()
     82 {
     83     int i,j,k,t,sx,sy;
     84     char ss[100];
     85     cin>>t;
     86     while(t--)
     87     {
     88         cin>>m>>n;
     89         gets(ss);
     90         memset(w,INF,sizeof(w));
     91         int g = 0;
     92         for(i = 1; i <= n ; i++)
     93         {
     94             getchar();
     95             for(j = 1; j <= m ; j++)
     96             {
     97                 scanf("%c",&str[i][j]);
     98                 if(str[i][j]=='A'||str[i][j]=='S')
     99                 {
    100                     g++;
    101                     ff[i][j]=g;
    102                 }
    103             }
    104         }
    105         int xx =0 ;
    106         for(i = 1; i <= n ; i++)
    107         for(j = 1 ; j <= m ; j++)
    108            if(str[i][j]=='A'||str[i][j]=='S')
    109                bfs(i,j);
    110         sum = 0;
    111         Prime(g);
    112         cout<<sum<<endl;
    113     }
    114     return 0;
    115 }
  • 相关阅读:
    杂记-2
    2019CSP-S游记
    csp2020
    特征根法小记
    csp模拟赛低级错误及反思
    备份
    黑科技——树剖两次dfs转一次dfs!
    输出天干地支
    蓝桥0531-输出Y
    蓝桥0615-判断四位数字前后两组是否相等
  • 原文地址:https://www.cnblogs.com/shangyu/p/2813287.html
Copyright © 2020-2023  润新知