首页 > 代码库 > UVa 10034 - Freckles
UVa 10034 - Freckles
题目是求连接全部斑点的最短墨迹的长度,即最小生成树。
思路:用Prim算法,或者Kruskal算法。
输入输出要稍微注意。
代码:
1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 #include <cstring> 5 #define INF 999999 6 #define MAXN 101 7 using namespace std; 8 9 double weight[MAXN][MAXN];10 11 struct Point{12 double x_;13 double y_;14 }FreckMap[MAXN];15 16 void init(int FreckNum);17 double dist(Point last,Point now);18 void prim(int Num);19 20 int main()21 {22 #ifndef ONLINE_JUDGE23 freopen("D:\\acm.txt","r",stdin);24 #endif // ONLINE_JUDGE25 int caseNum,FreckNum;26 scanf("%d",&caseNum);27 while(caseNum--){28 scanf("%d",&FreckNum);29 for(int i = 0;i < FreckNum;i++)30 scanf("%lf%lf",&FreckMap[i].x_,&FreckMap[i].y_);31 init(FreckNum);32 prim(FreckNum);33 if(caseNum)34 printf("\n");35 }36 return 0;37 }38 39 void init(int FreckNum){40 for(int i = 0;i < FreckNum;i++){41 for(int j = 0;j < FreckNum;j++){42 if(i == j)continue;43 weight[i][j] = dist(FreckMap[i],FreckMap[j]);44 }45 }46 }47 double dist(Point last,Point now){48 double dis;//暂时先不开方49 return dis = (last.x_ - now.x_)*(last.x_ - now.x_) + (last.y_ - now.y_)*(last.y_ - now.y_) ;50 }51 void prim(int Num){52 double lowcost[MAXN];53 int joinPoint,closest[MAXN];54 double min,pathDis = 0.0;55 for(int i = 0;i < Num;i++){ //给lowcost[]和closets[]置初值56 lowcost[i] = weight[0][i];57 closest[i] = 0;58 }59 for(int i = 1;i < Num;i++){ //找出(n-1)个顶点60 min = INF;61 for(int j = 0;j < Num;j++){ //在(V——U)中找出离U最近的顶点joinPoint62 if(lowcost[j] != 0&&lowcost[j] < min){63 min = lowcost[j];64 joinPoint = j; //joinPoint记录最近顶点的编号65 }66 }67 pathDis += sqrt(min); //生成树的总长68 lowcost[joinPoint] = 0; //标记joinpoint已经加入U69 for(int j = 0;j < Num;j++){ //修改数组lowcost和closest70 if(weight[joinPoint][j] != 0&&weight[joinPoint][j] < lowcost[j]){71 lowcost[j] = weight[joinPoint][j];72 closest[j] = joinPoint;73 }74 }75 }76 printf("%.2lf\n",pathDis);77 }
UVa 10034 - Freckles
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。