poj 3026Borg Maze

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

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 #define maxn 100
  6 #define maxn1 100000
  7 #include<queue>
  8 using namespace std;
  9 
 10 char s[maxn][maxn];
 11 const int inf=1<<23;
 12 int n,m;
 13 bool vis[maxn*7][maxn*7];
 14 bool visi[maxn*7];
 15 int dis[maxn*7][maxn*7];
 16 int c[maxn*7][maxn*7];
 17 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
 18 int dist[maxn*6];
 19 int ans;
 20 
 21 struct node
 22 {
 23     int x,y;
 24     int step;
 25 }p[maxn1],st1,st;
 26 
 27 void bfs(struct node st2)
 28 {
 29     st2.step=0;
 30     queue<node>q;
 31     q.push(st2);
 32     memset(vis,false,sizeof(vis));
 33     vis[st2.x][st2.y]=true;
 34     while(!q.empty())
 35     {
 36         st1=q.front();
 37         q.pop();
 38         for(int i=0; i<4; i++)
 39         {
 40             int xx=st1.x+dir[i][0];
 41             int yy=st1.y+dir[i][1];
 42             if(xx>=0&&xx<m&&yy>=0&&yy<n&&!vis[xx][yy]&&s[xx][yy]!='#')
 43             {
 44                 if(s[xx][yy]=='S'||s[xx][yy]=='A')
 45                 {
 46                     dis[c[st2.x][st2.y]][c[xx][yy]]=st1.step+1;
 47                     st.x=xx;
 48                     st.y=yy;
 49                     st.step=st1.step+1;
 50                     q.push(st);
 51                     vis[xx][yy]=true;
 52                 }
 53                 else
 54                 {
 55                     st.x=xx;
 56                     st.y=yy;
 57                     st.step=st1.step+1;
 58                     q.push(st);
 59                     vis[xx][yy]=true;
 60                 }
 61             }
 62         }
 63     }
 64 }
 65 
 66 bool prime(int num)
 67 {
 68      memset(visi,false,sizeof(visi));
 69      for(int i=1; i<=num; i++)
 70      {
 71          dist[i]=inf;
 72      }
 73      ans=0;dist[1]=0;
 74      for(int i=1; i<num; i++)
 75      {
 76          int temp=inf,k=0;
 77          for(int j=1; j<num; j++)
 78          {
 79              if(!visi[j]&&dist[j]<temp)
 80              {
 81                  temp=dist[j];
 82                  k=j;
 83              }
 84          }
 85          if(temp==inf) return false;
 86          visi[k]=true;
 87          ans+=temp;
 88          for(int j=1; j<num; j++)
 89          {
 90              if(!visi[j]&&dist[j]>dis[k][j])
 91                 dist[j]=dis[k][j];
 92          }
 93      }
 94      return true;
 95 }
 96 
 97 int main()
 98 {
 99     int t;
100     scanf("%d",&t);
101     while(t--)
102     {
103         int num=1;
104         char s1[100];
105         scanf("%d%d",&n,&m);
106         gets(s1);
107         memset(vis,false,sizeof(vis));
108         memset(c,-1,sizeof(c));
109         for(int i=0; i<m; i++)
110         {
111             gets(s[i]);
112             for(int j=0; j<n; j++)
113             {
114                 if(s[i][j]=='A'||s[i][j]=='S')
115                 {
116                     p[num].x=i;
117                     p[num].y=j;
118                     c[i][j]=num;
119                     num++;
120                 }
121             }
122         }
123         for(int i=1; i<num; i++)
124         {
125             bfs(p[i]);
126         }
127         prime(num);
128         printf("%d\n",ans);
129     }
130     return 0;
131 }
View Code

 

posted @ 2014-01-16 14:41  null1019  阅读(121)  评论(0编辑  收藏  举报