poj3026 bfs mst

挺综合的一题,就是空格有些无语,多亏discuss前辈们的指点。

渣代码抛砖引玉。

#include <iostream>
#include <queue>
using namespace std;
#define maxn 1010
#define maxm 100010
#define INF 100000000
int cas,n,m;
char s[110][110];
struct edge {
       int x,y,d,next;
}g[maxm];
struct data {
       int x,y;
}p[110];
queue<data> q;
int tot,first[maxn],pre[maxn],ans,sum,v[110][110],tx,ty;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
void add(int x,int y,int d) {
     tot++;
     g[tot].x=x;
     g[tot].y=y;
     g[tot].d=d;
     g[tot].next=first[x];
     first[x]=tot;     
     tot++;
     g[tot].x=y;
     g[tot].y=x;
     g[tot].d=d;
     g[tot].next=first[y];
     first[y]=tot;
}
void prim() {
     int t,i,j,k,min,lowcost[maxn];
     for (i=1;i<=n;i++) lowcost[i]=INF;
     memset(pre,0,sizeof(pre));
     for (t=first[1];t!=-1;t=g[t].next)
         lowcost[g[t].y]=g[t].d;
     for (i=2;i<=n;i++)
         pre[i]=1;
     lowcost[1]=0;
     for (i=2;i<=n;i++) {
         min=INF;
         for (j=2;j<=n;j++)
             if (lowcost[j]<min && lowcost[j]!=0) {
                min=lowcost[j];
                k=j;
             }
         ans+=min;
         lowcost[k]=0;
         for (t=first[k];t!=-1;t=g[t].next)
             if (g[t].d<lowcost[g[t].y]) {
                lowcost[g[t].y]=g[t].d;
                pre[g[t].y]=k;
             }
     }
}
void bfs(int i) {
     while (!q.empty()) q.pop();
     data tmp = p[i];
     q.push(tmp);
     v[tmp.x][tmp.y] = 0;
     while (!q.empty()) {
           tmp = q.front();
           q.pop();
           for (int k=0;k<4;k++) {
               tx = tmp.x+dx[k];
               ty = tmp.y+dy[k];
               if (tx>=1 && tx<=n && ty>=0 && ty<m && v[tx][ty]==-1 && s[tx][ty]!='#') {
                         v[tx][ty] = v[tmp.x][tmp.y]+1;
                         data t;
                         t.x = tx;
                         t.y = ty;
                         q.push(t);
               }
           }
     }
}
int main() {
    scanf("%d",&cas);
    while (cas--) {
          scanf("%d%d",&m,&n);
          gets(s[0]);
          for (int i=1;i<=n;i++)
              gets(s[i]);
          sum = 0;
          for (int i=1;i<=n;i++)
              for (int j=0;j<m;j++)
                  if (s[i][j]=='A'||s[i][j]=='S') {
                     sum++;
                     p[sum].x = i;
                     p[sum].y = j;
                  }
          tot = 0;
          memset(first,-1,sizeof(first));
          for (int i=1;i<sum;i++) {
              memset(v,-1,sizeof(v));
              bfs(i);
              for (int j=i+1;j<=sum;j++)
                  add(i,j,v[p[j].x][p[j].y]);
          }
          ans = 0;
          n = sum;
          prim(); 
          printf("%d\n",ans);    
    }
    return 0;
}


你可能感兴趣的:(poj3026 bfs mst)