poj 3026

算法:

1.刚开始自己的算法是一次BFS,求出各点距离,建好图,但是提交上去一直WA,不解。

2.修正算法枚举所有A与S点,AC。。

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;

struct node
{
  int a, b, num;
  bool operator < ( const node& A) const
  {
    return num < A.num;
  }
}edge[4100000];


struct Qnode
{
 int ID, x, y, preID;
 int dis;
}p, px[110];

int N, e, A, B, set[41000], visit[40000], maxn;

int xx[ ] = {0, 1, -1, 0};
int yy[ ] = {1, 0, 0, -1};

char mp[510][510];
queue<Qnode>q;
 
int find( int x )
{
  return x == set[x] ? x : set[x] = find(set[x]);
}

void merge( int x, int y)
{
   set[x] = y;
}

int jugde( int x, int y)
{
 if ( x < 1 || x > B || y < 0 || y >= A )
    return 0;
 return 1;  
}
void BFS(int x)
{
  memset(visit, 0, sizeof(visit));
  visit[x] = 1;
  while( !q.empty() )
  {
     p = q.front();
     q.pop( );
     int x = p.x;
     int y = p.y;
     int ID = p.ID;
     int num = p.dis;
     int pre = p.preID;
     if(  mp[x][y] == 'A' && ID != x)
     {   
         edge[e].a = pre;
         edge[e].b = ID; 
         edge[e++].num = num;
     }
     for( int i = 0; i < 4; i++)
     {
         int x1 = x + xx[i];
         int y1 = y + yy[i];
         int ans = x1 * maxn + y1;
         if( mp[x1][y1] != '#' && !visit[ans]  && jugde(x1,y1) )
         { 
             p.x = x1;
             p.y = y1;
             p.preID = pre;
             p.ID = ans;
             p.dis = num + 1;
             q.push( p );
             visit[ans] = 1;
         }

     }
     
         
  }   
          
}
void init( )
{
  for( int i = 1; i <= 40000; i++)
  { 
    set[i] = i;
  }
}

void Krusal( )
{
  init( );
  int sum = 0;
  sort( edge, edge + e);
  for( int i = 0; i < e; i++)
  {  
     int x = find(edge[i].a);
     int y = find(edge[i].b);
     if( x != y )
     {
        merge(x, y);
        sum += edge[i].num;
     }
     
  }
  printf("%d\n",sum);

}



int main( )
{
  int T, n;
  scanf("%d",&T);
  while( T-- )
  {
    e = 0;
    n = 0;
    scanf("%d%d",&A,&B); 
    maxn = max(A, B);
    char c[100];
    gets(c);
    for( int i = 1; i <= B; i++)
    {
       gets(mp[i]);
       for( int j = 0; j < A; j++)
       {
         if( mp[i][j] == 'S' || mp[i][j] == 'A')
         {
             px[n].dis = 0;
             px[n].x = i;
             px[n].y = j;
             px[n].ID = px[n].x * maxn + px[n].y;
             px[n].preID = px[n].ID;
             n++;
         }
       }
    }
    for( int i = 0; i < n; i++)
    {
      q.push( px[i] );
      BFS( px[i].ID );
    }
    Krusal();
  }
  return 0;
}

转载于:https://www.cnblogs.com/tangcong/archive/2012/07/12/2588006.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值