题意:起点开始有超过100个人,总共不会超过100个外星人,问把所有的外星人都搜出来花的最小时间。一条路径上的时间跟人数是无关的,只跟路径长度有关。
思路:刚开始人都在起点,当派一定人数去最近的外星人后,起点就变成两个了,然后从两个起点去最近的外星人,起点就变成三个了,,,,这就是最小生成树了。
include#include #include #include #include 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 Q; edge cur,next; int i,j,x,y; for(i=0;i =0&&x =0&&y next.w) { map[x][y]=next.w; if(vis[x][y]==false) {Q.push(next);vis[x][y]=true;} } } } } for(i=1;i