您的位置:首页 > 其它

POJ 2349 Arctic Network(最小生成树 kruscal or prim)

2013-07-15 17:33 555 查看
PS:博主这个题比较闹心。首先是理解题意就花了好长时间。T^T。写好后没有使用强制类型转换CE好久,之后又是顶点数量确定后没有确定边的最大数量,连续RE十几次,检查就花了几个小时,只能凌晨发文了。。。。。。
来,此题描述不好理解。。(或许是博主英语拙计的缘故吧T^T)。。题目要求最小生成树中除去卫星数量减一的最大边的剩余最小生成树中的最大边。说起来好绕口 =.= 。好吧,prim kruscal
都可以。博主用的是kruscal。

还有注意的就是将点的坐标转换为边的信息时的代码。

#include <stdio.h>

#include <math.h>

#include <algorithm>

const int MAXCOST = 250010;   //边的最大数目。

using namespace std;

typedef struct   //储存坐标
{
int x,y;
}node;

node point[MAXCOST];

int cnt;

typedef struct  //储存边的信息
{
int u,v;
double w;
}Edge;

Edge  edge[MAXCOST];

bool cmp( const Edge a ,const Edge b)
{
return a.w<b.w;
}

int root[MAXCOST];

int main()
{
void len(int x,int y);
void init(int m);
int find_set(int x);
void union_set(int x,int y);
void kruscal(int n,int m);
int k,n,m;
double x,y;
scanf("%d",&k);
while(k--)
{
cnt = 0;
scanf("%d %d",&n,&m);
for(int i = 0 ; i < m ; i++)
{
scanf("%d %d",&point[i].x,&point[i].y); //输入坐标的信息
}
for(int i = 0 ; i < m ; i++)     //计算任意两点间的距离。
{
for(int j = 0 ; j < m ; j++)
{
if(i!=j) //kruscal算法不用存回路的边的信息
len(i,j);
}
}
kruscal(n,m);
}
return 0;
}

void init(int m)
{
for(int i = 0 ; i < m ; i++)
{
root[i] = i;
}
}

int find_set(int x)
{
if(x!=root[x])
{
root[x] = find_set(root[x]);
}
return root[x];
}

void union_set(int x,int y)
{
int a = find_set(x);
int b = find_set(y);
if(a!=b)
{
root[b] = a;
}
}

void len(int x,int y)  //计算两点间的距离。PS:注意强制类型转化
{
edge[cnt].v = x;
edge[cnt].u = y;
edge[cnt++].w = sqrt(double((point[x].x-point[y].x) * (point[x].x-point[y].x)+(point[x].y - point[y].y) * (point[x].y - point[y].y)));
}

void kruscal(int n,int m)
{
int key = 0;
double distance;
sort(edge,edge+cnt,cmp);
init(m);
for(int i = 0 ; i < cnt ; i++)
{
if(find_set(edge[i].u) != find_set(edge[i].v))
{
key++;
union_set(edge[i].u,edge[i].v);
distance = edge[i].w;
if(key == m-n)  //找到最小生成树中除去s-1条最大边的最大边长
{
printf("%.2lf\n",distance);

}
}
}
}


ps:时间好晚。。。碎个好觉去。。明天还要上课T*T
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: