最小生成树 Prim (hdu 1875)

来源:互联网 发布:电信4g网络好用吗 编辑:程序博客网 时间:2024/05/29 07:45

 

                          题意就不解释了。直接用最小生成树。

                代码如下

#include <stdio.h>#include <stdlib.h>#include <math.h>#include <iostream>using namespace std;#define N 101#define M 100000struct sa{       int a,b;}data[N];double map[N][N];int n;int tol;int set[N];int  find (int x){     return set[x]=(set[x]==x?x:find(set[x]));}void merge(int a,int b){     int x=find(a),y=find(b);     if(x!=y)     {             set[x]=y;             tol--;     }}void mst()//最小生成树 Prim算法   {        bool flag[N];    double lowlen[N];    int node[N];    int i,j;    double min;    for(i=0;i<n;++i)    {                    flag[i]=false;    }    flag[0]=true;    int count=n;    double sum=0;      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+=map[j][node[j]];       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;                }          }          }    sum=sum*100;    printf("%.1f\n",sum);}    int main(){    int m;    scanf("%d",&m);    while(m--)    {              double ss=0;              int i,j;              scanf("%d",&n);              tol=n-1;              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);                set[i]=i;              }              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)) );                          if(ss>=10 && ss<=1000)                          {                              merge(i,j);                              map[i-1][j-1]=map[j-1][i-1]=ss;                          }                       }               if(tol>0)              {                      printf("oh!\n");                      continue;              }              mst();    }    return 0;}


 

原创粉丝点击