虽然是道普通的最小生成树题目,可还是中间出了不少问题,暴露的一个问题是不够细心,不够熟练。所以这篇博客就当记录一下bug吧。

代码一:kruskal

 #include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define N 110 typedef struct
{
double x,y;
} Point;
Point point[N]; typedef struct
{
int u,v;
double c;
} EDGE;
EDGE edge[N*N/+];
int m,tc,n,pre[N]; double cal(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int dblcmp(double x)
{
if(fabs(x)<1e-)
return ;
return x>?:-; }
int cmp(const void*i,const void*j)
{
EDGE *a=(EDGE*)i;
EDGE *b=(EDGE*)j; return dblcmp(a->c-b->c); }
void add_edge(int u,int v,double c)
{
edge[m].u=u;
edge[m].v=v;
edge[m].c=c;
m++;/*记得更新*/
} int find(int u)
{
int x=u;
for(; pre[x]>=; x=pre[x]) ;/*条件判断应该是是pre[x]>=0*/
while(x!=u)
{
int t=pre[u];
pre[u]=x;
u=t;
}
return x;
} double kruskal(void)
{
double ans=0.0;
int num=;
memset(pre,-,sizeof(pre));
int i;
qsort(edge,m,sizeof(EDGE),cmp);/*sort before algorithm*/
/*for(i=0;i<m;i++)
printf("%f\n",edge[i].c); */
for(i=; i<m; i++)
{
int u=edge[i].u;
int v=edge[i].v;
int x,y;
if((x=find(u))!=(y=find(v)))
{
ans=ans+edge[i].c;
pre[x]=y;
num++;
}
if(num==n-)
break;
}
return ans;
} void input(void)
{
m=;
scanf("%d",&n);
int i,j;
for(i=; i<n; i++)
scanf("%lf%lf",&point[i].x,&point[i].y); for(i=; i<n-; i++)
for(j=i+; j<n; j++)
{
double s=cal(point[i],point[j]);
add_edge(i,j,s);
} } void solve()
{
double mst;
mst=kruskal();
printf("%.2f\n",mst);
if(tc)
puts("");
} int main(void)
{
scanf("%d",&tc);
while(tc--)
{
input();
solve();
}
return ;
}

代码二:prim

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#define N 110
#define INF 1000000000000000/*这里要开大于点,不然WA*/ using namespace std;
int n,tc;
double dis[N][N];
double x[N],y[N]; double cal(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
} void input(void)
{
scanf("%d",&n);
int i,j;
for(i=; i<n; i++)
scanf("%lf%lf",x+i,y+i);
for(i=; i<n-; i++)
for(j=i+; j<n; j++)
dis[i][j]=dis[j][i]=cal(x[i],y[i],x[j],y[j]);
} double Prim(void)
{
double lowcost[N];
int vis[N];
memset(vis,,sizeof(vis));
for(int i=; i<N; i++)
lowcost[i]=INF;
vis[]=-;
int e=,i;
double ans=;
for(int k=; k<n-; k++)
{
double micost=INF;
int miedge=-;
for( i=; i<n; i++)
if(vis[i]!=-)
{
double temp=dis[e][i];
if(temp<lowcost[i])
{
lowcost[i]=temp;
vis[i]=e;
}
if(lowcost[i]<micost)
micost=lowcost[miedge=i];
}
ans+=micost;
e=miedge;/*表示miedge这个顶点作为加入点*/
vis[miedge]=-;/*用来记录下次加入的点*/
}
return ans;
} void solve(void)
{
double mst=Prim();
printf("%.2f\n",mst);
if(tc)
puts("");
} int main()
{
scanf("%d",&tc);
while(tc--)
{
input();
solve();
}
return ;
}

UVA 10034 Freckles 最小生成树的更多相关文章

  1. UVa 10034 - Freckles

    题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和. 最小生成树问题,用Kruskal算法进行求解,其中用到了并查集.将所有的点连接,构成一张图,对每一条边进行编号,两点 ...

  2. uva 10034 Freckles (kruskal||prim)

    题目上仅仅给的坐标,没有给出来边的长度,不管是prim算法还是kruskal算法我们都须要知道边的长度来操作. 这道题是浮点数,也没啥大的差别,处理一下就能够了. 有关这两个算法的介绍前面我已经写过了 ...

  3. 10034 - Freckles 克鲁斯克尔最小生成树!~

    /* 10034 - Freckles 克鲁斯克尔最小生成树!- */ #include<iostream> #include<cstdio> #include<cmat ...

  4. 训练指南 UVA - 11354(最小生成树 + 倍增LCA)

    layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...

  5. uva 10034 Problem A: Freckles

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  6. uva 1151(最小生成树,枚举子集)

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐,可以 ...

  7. uva 10048 Audiophobia(最小生成树)

    题目链接:10048 - Audiophobia 题目大意:有n个城市,和m条街道,每条街道有一个噪音值,q次去问,从城市a到城市b,路径上分贝值的最大值最小为多少. 解题思路:与uva 10099的 ...

  8. uva 10034

    计算所有点之间的权值   然后就是最小生成树 #include<cstring> #include<string> #include<cstdio> #includ ...

  9. 题目1144:Freckles(最小生成树进阶)

    题目链接:http://ac.jobdu.com/problem.php?pid=1144 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

随机推荐

  1. find命令基本使用一览

    find命令相对于locate这种非实时查找的搜索命令,大大增加了我们搜索的便捷度以及准确性:并且能够方便的帮助我们对大文件.特定类型的文件查找与删除,特别是有超多小碎文件的时候,更是方便至极.... ...

  2. I2C Verilog的实现(二)

    1. 起始结束信号的判断 //--------------------------------------------- //start,stop condition judgement //---- ...

  3. Maven笔记(一)

    1. 坐标 Maven坐标为各种构件引入了秩序,任何一个构件都有必须明确定义自己的坐标,而一组Maven坐标是通过一些元素定义的,它们是groupId, artifactId, version, pa ...

  4. 史上最全的JavaScript工作笔记

    /* * JavaScript查看对象函数 */ function resultTest( obj ){ var resultTest = ''; $.each(obj,function(key,va ...

  5. Nullable类型和HashSet<T>集合

    今天接触到两个新的类型,查了一下才发现它们已经出现好久了,特作一下标记 Nullable结构 在System命名空间下,在 .NET Framework 2.0 版中是新增的:用它定义的值类型的对象与 ...

  6. 20151215jqueryUI--dialog代码备份

    $(function () { $('#search_button').button(); /*$('#reg_a').click(function() { $('#reg').dialog(); } ...

  7. kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)

    这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表 tt1 和表 tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新 ...

  8. C++编程注意事项

    1.所有成员变量在构造函数中进行初始化操作,如指针赋值为空,bool赋值为FALSE(默认为TRUE); 2.构造函数与析构函数配对出现,执行反向操作,保证执行析构之后,没有遗留问题存在: 3.如果需 ...

  9. ORACLE no1 存储过程插入更新表数据

    CREATE OR REPLACE PROCEDURE sp_cust_main_data_yx(InStrDate  IN VARCHAR2,                             ...

  10. iOS-开发日志-UITextView介绍

    UITextView 属性 1.     text: 设置textView中文本 _textView.text = @"Now is the time for all good develo ...