题意:起点开始有超过100个人,总共不会超过100个外星人,问把所有的外星人都搜出来花的最小时间。一条路径上的时间跟人数是无关的,只跟路径长度有关。

思路:刚开始人都在起点,当派一定人数去最近的外星人后,起点就变成两个了,然后从两个起点去最近的外星人,起点就变成三个了,,,,这就是最小生成树了。

include<stdio.h>
#include<math.h>
#include<queue>
#include<stdlib.h>
#include<string.h>
const int N=251;
const int inf=0x3fffffff;
using namespace std;
int num,f[N],n,m,k,map[51][51],dir[4][2]={0,1,0,-1,1,0,-1,0};
bool vis[51][51];
char cap[51][51];
struct edge
{
int st,ed,w;
}e[N*N];
struct node
{
int x,y;
}p[N];
void addedge(int x,int y,int w)
{
e[num].st=x;e[num].ed=y;e[num++].w=w;
}
int dis(int i,int j)
{
return abs(p[i].x-p[j].x)+abs(p[i].y-p[j].y);
}
int cmp(void const *a,void const *b)
{
edge *c,*d;
c=(edge *)a;
d=(edge *)b;
return c->w-d->w;
}
int find(int a)
{
if(a!=f[a])
f[a]=find(f[a]);
return f[a];
}
void bfs(int u)
{
queue<edge>Q;
edge cur,next;
int i,j,x,y;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
map[i][j]=inf;
vis[i][j]=false;
}
map[p[u].x][p[u].y]=0;vis[p[u].x][p[u].y]=true;
cur.st=p[u].x;cur.ed=p[u].y,cur.w=0;
Q.push(cur);
while(!Q.empty())
{
cur=Q.front();
Q.pop();vis[cur.st][cur.ed]=false;
for(i=0;i<4;i++)
{
next.st=x=cur.st+dir[i][0];
next.ed=y=cur.ed+dir[i][1];
if(x>=0&&x<n&&y>=0&&y<m&&cap[x][y]!='#')
{
next.w=cur.w+1;
if(map[x][y]>next.w)
{
map[x][y]=next.w;
if(vis[x][y]==false)
{Q.push(next);vis[x][y]=true;}
}
}
}
}
for(i=1;i<k;i++)
{
if(i==u)continue;
addedge(u,i,map[p[i].x][p[i].y]);
} }
int main()
{
int i,j,t,sum,x,y;
char str[100],ch;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
ch=getchar();
while(ch!='\n')
ch=getchar();
k=1;num=0;sum=0;
for(i=0;i<n;i++)
{
gets(str);
for(j=0;j<m;j++)
{
cap[i][j]=str[j];
if(str[j]=='A'||str[j]=='S')
{p[k].x=i;p[k++].y=j;}
}
}
for(i=1;i<k;i++)
{f[i]=i;bfs(i);}
qsort(e,num,sizeof(e[0]),cmp);
for(i=0;i<num;i++)
{
x=find(e[i].st);
y=find(e[i].ed);
if(x==y)continue;
sum+=e[i].w;
f[x]=find(y);
}
printf("%d\n",sum);
}
return 0;
}

最新文章

  1. IOS下载查看PDF文件(有下载进度)
  2. error: RPC failed; result=22, HTTP code = 411
  3. install mysql using binary and configure manu
  4. struts深入原理之RequestProcessor与xml
  5. Hibernate的关联映射——单向1-1关联
  6. Spring学习(5)---Bean的定义及作用域的注解实现
  7. G1垃圾收集器和CMS垃圾收集器 (http://mm.fancymore.com/reading/G1-CMS%E5%9E%83%E5%9C%BE%E7%AE%97%E6%B3%95.html#toc_8)
  8. 201521123096《Java程序设计》第十二周学习总结
  9. 周一干货~手把手教你安装 Visual Studio 安卓模拟器
  10. .Net NPOI 上传excel文件、提交后台获取excel里的数据
  11. 用ActiveX 创建自己的comboBox 控件(一)
  12. 【转】修改Android解锁界面
  13. iptables基础配置
  14. spring mvc实现restful
  15. jenkins svn源码管理小记
  16. c# http操作类
  17. Navigator 传值
  18. 《Linux/UNIX系统编程手册》读书笔记
  19. python学习之路---day07
  20. MYSQL存储引擎介绍--应用场景

热门文章

  1. Cocos2d-x 架构一个游戏的一般思路
  2. 三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)
  3. JAVA JNI
  4. 云脉提供表单识别API接口自助接入
  5. freemarker声明变量
  6. USACO Section 2.1 Sorting a Three-Valued Sequence
  7. .NET中的CSV导入导出(实例)
  8. html css js 框架
  9. a:hover span 隐藏/显示 问题
  10. Android app去应用市场评分功能