poj 2349 (最小生成树 Prim)

来源:互联网 发布:电信4g网络好用吗 编辑:程序博客网 时间:2024/06/04 18:28

   这道题把题目看懂就很简单了。自己做时 浪费很多时间在看题上。但是一次过了,还不错。

  代码如下:

#include <stdio.h>#include <stdlib.h>#include <math.h>#include <iostream>#include <algorithm>using namespace std;#define N 550#define M 100000struct sa{       int a,b;}data[N];double map[N][N];int n;int p;int cmp(const double a,const double b){    return a>b;}void mst()//最小生成树 Prim算法   {        bool flag[N];    double lowlen[N];    int node[N];    int i,j,k=0;    double min;    for(i=0;i<n;++i)    {                    flag[i]=false;    }    flag[0]=true;    int count=n;    double sum[N];      for(i=1;i<n;++i)    {      lowlen[i]=map[0][i];      node[i]=0;    }    while(--count)    {       min=M;       j=0;       for(i=0;i<n;++i)       {          if(!flag[i] && lowlen[i]<min )                    {                         min=lowlen[i];                         j=i;                    }       }       sum[k]=map[j][node[j]];       k++;       flag[j]=true;       for(i=0;i<n;++i)       {                if(!flag[i] && lowlen[i]>map[i][j] )                    {                            lowlen[i]=map[i][j];                            node[i]=j;                }          }          }    sort(sum,sum+n,cmp);    printf("%.2f\n",sum[p-1]);}    int main(){    int m;    scanf("%d",&m);    while(m--)    {              double ss=0;              int i,j;              scanf("%d%d",&p,&n);              for(i=0;i<n;i++)              for(j=0;j<n;j++)                 map[i][j]=M;              for(i=1;i<=n;i++)              {                scanf("%d%d",&data[i].a,&data[i].b);              }              for(i=1;i<n;i++)                     for(j=i+1;j<=n;j++)                     {                          ss=sqrt( ((data[j].a-data[i].a)*(data[j].a-data[i].a) + (data[j].b-data[i].b)*(data[j].b-data[i].b)) );                          map[i-1][j-1]=map[j-1][i-1]=ss;                     }               mst();    }    return 0;}