您的位置:首页 > 其它

SDAU练习四

2016-06-27 22:38 357 查看
题意:一张图画出N个点,找出连接所有点的最短长度

思路:带权的无向图,求最小生成树,一般来说用prim或者是kruskal算法就可以。

感想:求最小生成树的一般算法,豆豆给我大致讲了一下,这个地方上课没太听懂,现在补了Ixia~

源代码:

#include<cstdio>

#include<iostream>

 #include<cmath>

 #include<algorithm>

 using namespace std;

 struct Node

 { int x,y;

   double cost;

 }g[5005];

 int pre[105];

 int find(int n){return n==pre
? n: find(pre
);}

 bool cmp(Node a,Node b){return a.cost < b.cost;}

 int main()

 {

     int n;

     while(scanf("%d",&n) != EOF){

         int k=0;

         double sum=0;

         double x[105],y[105];

         for(int i = 1; i <= n; i++)scanf("%lf%lf",&x[i],&y[i]);

         for(int i = 1;i <= n; i++)

             for(int j = i+1; j <= n; j++){

                  g[k].x = i;

                  g[k].y = j;

                  g[k++].cost = sqrt(abs((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));

         }

         for(int i = 1;i <= n; i++)pre[i] = i;

         sort(g,g+k,cmp);

         for(int i = 0; i < k; i++){

                 int x = find(g[i].x);

                 int y = find(g[i].y);

                 double z = g[i].cost;

                 if(x != y){

                     sum += z;

                     pre[x]=y;

                 }

         }

         printf("%.2f\n",sum);

     }

     return 0;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: