poj 3026 (bfs+prim)

这个题有一个意思描述使的题目简单了。。囧。。开始还以为数据水呢。其实是我题目没看清楚。。。只能在A,S的时候才能分成很多的路径。

1
5 8
A###A
 ###
     
## ##
## ##
## ##
##S##
#####

比如这个数据输出的是16。ps:假如没有那个条件的话,就是应该输出12。。。。(怎么做?。。)

这题的代码:

View Code
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <queue>
  5 
  6 using namespace std;
  7 
  8 #define inf 0x7ffffff
  9 #define MAXN 52
 10 int map[MAXN<<1][MAXN<<1];
 11 char c[MAXN][MAXN];
 12 int id[MAXN][MAXN];
 13 int y,x,cnt;
 14 int dir[4][2]={0,-1,0,1,-1,0,1,0};
 15 
 16 struct point
 17 {
 18     int x,y;
 19     int step;
 20     point(){}
 21     point(int a,int b,int c){x=a,y=b,step=c;}
 22 };
 23 
 24 bool is_ok(int i,int j)
 25 {
 26     if(i>=0 && i<x && j>=0 && j<y)
 27         return true;
 28     return false;
 29 }
 30 
 31 void bfs(int tx,int ty)
 32 {
 33     queue<point> q;
 34     while(!q.empty()) q.pop();
 35     bool vis[MAXN][MAXN];
 36     point sp=point(tx,ty,0);
 37     memset(vis,0,sizeof(vis));
 38     vis[tx][ty]=1;
 39     q.push(sp);
 40     while(!q.empty())
 41     {
 42         point cur,next;
 43         cur=q.front();q.pop();
 44         if(c[cur.x][cur.y]=='A' || c[cur.x][cur.y]=='S')
 45             map[id[tx][ty]][id[cur.x][cur.y]]=cur.step;
 46         for(int i=0;i<4;i++)
 47         {
 48             next.x=cur.x+dir[i][0];
 49             next.y=cur.y+dir[i][1];
 50             next.step=cur.step+1;
 51             if(!is_ok(next.x,next.y)) continue;
 52             if(c[next.x][next.y]=='#') continue;
 53             if(vis[next.x][next.y]) continue;
 54             vis[next.x][next.y]=1;
 55             q.push(next);
 56         }
 57     }
 58 }
 59 //---------------prim--------------
 60 int prim(int N)
 61 {
 62     int i,j;
 63     int ans=0;
 64     int dis[MAXN<<1];
 65     bool vis[MAXN<<1];
 66     for(i=0;i<N;i++)
 67     {
 68         vis[i]=0;
 69         dis[i]=map[0][i];
 70     }
 71     vis[0]=1;
 72     for(i=0;i<N-1;i++)
 73     {
 74         int MIN=inf,flag=-1;
 75         for(j=0;j<N;j++)
 76         {
 77             if(!vis[j] && dis[j]<MIN)
 78             {
 79                 flag=j;
 80                 MIN=dis[j];
 81             }
 82         }
 83         vis[flag]=1;
 84         ans+=MIN;//答案
 85         for(j=0;j<N;j++)
 86             if(!vis[j] && map[flag][j]<dis[j])
 87                 dis[j]=map[flag][j];
 88     }
 89     return ans;
 90 }
 91 //---------------------------------
 92 
 93 
 94 int main()
 95 {
 96     int t;
 97     scanf("%d",&t);
 98     while(t--)
 99     {
100         cnt=0;
101         scanf("%d%d",&y,&x);
102         gets(c[0]);
103         memset(c,0,sizeof(c));
104         for(int i=0;i<x;i++)
105         {
106             gets(c[i]);
107             for(int j=0;j<y;j++)
108                 if(c[i][j]=='A' || c[i][j]=='S')
109                     id[i][j]=cnt++;
110         }
111         for(int i=0;i<x;i++)
112         {
113             for(int j=0;j<y;j++)
114                 if(c[i][j]=='A' || c[i][j]=='S')
115                     bfs(i,j);
116         }
117         /*------------------
118         for(int i=0;i<cnt;i++)
119         {
120             for(int j=0;j<cnt;j++)
121                 cout<<map[i][j];
122             cout<<endl;
123         }
124         */
125         printf("%d\n",prim(cnt));
126 
127     }
128 }
129 /*
130 1
131 5 8
132 A###A
133  ###
134      
135 ## ##
136 ## ##
137 ## ##
138 ##S##
139 #####
140  */
posted @ 2012-10-20 23:28  Missa  阅读(226)  评论(0编辑  收藏  举报