poj3026 Borg Maze(MST)

这道题出了几个问题:
1.数组开的太小.prim里的dis,vis数组要开的大一点,最开始只开了100,疯狂wa, 后来发现A点数有可能大于100.
2.bfs忘记判边界.一直死循环.
3.加入队列之后标记变量忘记.真弱智
4.head,tail,count忘记++就不说了.
5.这里字符的读入有点坑,要用一个gets()把行末的回车去掉,并且读入的时候必须用gets,不然空格无法读入
这道题不会做充分体现了只会做模板题的特点.根本想不到先用bfs求出距离再求MST.

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

char map[100][100];
int dis[109];
int m,n;
int node[200][200];
int xx[4]={0,1,0,-1};
int yy[4]={1,0,-1,0};
int mmp[200][200];

struct P{
	int x;
	int y;
    int w;
}que[4510];
void bfs(int p ,int q)
{
    bool vis[200][200];
    memset(vis,false,sizeof(vis));
    int head = 0, tail = 1;
    que[head].x = p;
    que[head].y = q;
    que[head].w = 0;
    vis[p][q] = true;
    while(head < tail)
    {
    	int l = que[head].x;
    	int r = que[head].y;
        if (node[l][r])	
	     mmp[node[p][q]][node[l][r]] = mmp[node[l][r]][node[p][q]] =que[head].w;
	    for(int i = 0;i < 4;i ++)
	     {
	     	int mx = l+xx[i];
	        int my = r+yy[i];
	        if(mx>=1 && mx <= n && my >=1 && my <= m)
			if(!vis[mx][my] && map[mx][my] != '#')
	          {
	          	
	          	que[tail].x = mx;
	          	que[tail].y = my;
	          	que[tail].w = que[head].w+1;
			    tail++;
			    vis[mx][my] = true;
			  }
		 }
	    head++;
	}
}
int prim(int nn){
	int count = 1;
	int sum = 0;
	for(int i = 1;i <= nn;i++)
	  dis[i] = mmp[1][i];
	dis[1] = 0;
	bool vis[200];
	memset(vis,false,sizeof(vis));
	vis[1] =true;
	while(count<nn)
	{   int mm= 999999,t;
		for(int i = 1;i <= nn;i++)
		 if(!vis[i] && mm > dis[i])
		  {
		  	mm = dis[i];
		  	t = i;
		  }
		  sum += mm;
		  vis[t] = true;
		for(int i = 1;i <= nn;i++)
		 if(!vis[i] && dis[i]>mmp[t][i]) dis[i] = mmp[t][i];
	    count++;
	}
	return sum;
}
int main(){
	int T;
	cin>>T;
	while(T--)
	{   int num = 0;
		memset(node,0,sizeof(node));
		cin>>m>>n;
		char cnm[100];
		gets(cnm);
		for(int i = 1;i <= n;i ++)
		 {
		 gets(map[i]+1);
			for(int j = 1;j <= m;j ++)
			 if(map[i][j]=='A' || map[i][j] == 'S')
			 {
			 	node[i][j]=++num;
			 }
	     }
	     
		for(int i = 1;i <= n;i ++)
	     for(int j = 1;j <= m;j ++)
	      if(node[i][j])  bfs(i,j);  
		int nnn = prim(num);
		cout<<nnn<<endl;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值