UVA 10034 Freckles 最小生成树
虽然是道普通的最小生成树题目,可还是中间出了不少问题,暴露的一个问题是不够细心,不够熟练。所以这篇博客就当记录一下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 最小生成树的更多相关文章
- UVa 10034 - Freckles
题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和. 最小生成树问题,用Kruskal算法进行求解,其中用到了并查集.将所有的点连接,构成一张图,对每一条边进行编号,两点 ...
- uva 10034 Freckles (kruskal||prim)
题目上仅仅给的坐标,没有给出来边的长度,不管是prim算法还是kruskal算法我们都须要知道边的长度来操作. 这道题是浮点数,也没啥大的差别,处理一下就能够了. 有关这两个算法的介绍前面我已经写过了 ...
- 10034 - Freckles 克鲁斯克尔最小生成树!~
/* 10034 - Freckles 克鲁斯克尔最小生成树!- */ #include<iostream> #include<cstdio> #include<cmat ...
- 训练指南 UVA - 11354(最小生成树 + 倍增LCA)
layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...
- uva 10034 Problem A: Freckles
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- uva 1151(最小生成树,枚举子集)
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐,可以 ...
- uva 10048 Audiophobia(最小生成树)
题目链接:10048 - Audiophobia 题目大意:有n个城市,和m条街道,每条街道有一个噪音值,q次去问,从城市a到城市b,路径上分贝值的最大值最小为多少. 解题思路:与uva 10099的 ...
- uva 10034
计算所有点之间的权值 然后就是最小生成树 #include<cstring> #include<string> #include<cstdio> #includ ...
- 题目1144:Freckles(最小生成树进阶)
题目链接:http://ac.jobdu.com/problem.php?pid=1144 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
随机推荐
- C++ STL (备忘)
2014-08-04 16:33:57 (1) map map定义形式 map<type1,type2> map_name; map的基本操作函数: C++ Maps是一种关 ...
- css定义多重背景动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style typ ...
- 将文件的编码格式转换为utf-8
背景:项目中有一些其他部门发过来的代码,编码格式有utf-8,也有GBK,而且是散乱在各个文件夹中的,处理起来十分的麻烦.我想把他们都转成统一的utf-8的格式.代码很简单,直接上代码好了. impo ...
- 经历:easyui的datagrid没有数据滚动条的显示
今天,一个用户提出一个这样的问题,"查询不到结果时,为什么我看不到后面的标题呢?" 最初,我听到这个问题时,第一反应是:查出来数据不就有滚动条了吗,干嘛非要较真呢? 不过,后来想想 ...
- 0基础学习ios开发笔记第二天
C语言的基本结构 c语言的入口函数是main函数. main函数的返回值行业标准是int return 数字:返回值 每条语句最后以分号结尾 注释:行注释.块注释 int main(void) { / ...
- JamCam创业故事:辞掉工作,去开发一个应用
编者按:这是JamCam创始人的自述.这家初创公司提供的应用很简单,但是极为成功:有了JamCam,你所录制的视频会自动添加你正在iPhone中聆听的音乐,作为视频的背景音乐.和朋友分享时是不是方便多 ...
- Java内存模型JMM与可见性
Java内存模型JMM与可见性 标签(空格分隔): java 1 何为JMM JMM:通俗地讲,就是描述Java中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这 ...
- HTTP中Get与Post、ViewState 原理
Http是请求,响应的模型,服务器不会来读取浏览器的网页,只能够得到客户端提交过来的数据当用户点击提交,服务器就知道"提交回来了"(PostBack) Get与Post 设置for ...
- 判断JS对象是否拥有某属性的方法举例
判断JS对象是否拥有某属性 JS是否拥有某属性的判断方法,这里提供两种方式,供大家参考. 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); ...
- 4MLinux7.0 服务器配置详解 别名TheSSS
TheSSS download 特性:thttp,php5.5.1,mysql,vsftp,proxy,firewall,带rpm管理器.更新频繁. 官方帮助文件:View (新窗口打开) 发现国内4 ...