prim&&kruskal模板

#include<stdio.h>
#include<stdlib.h>
double min[10001]={0};
long long x[10001]={0},y[10001]={0},vis[10001]={0};
double cal(int a,int b)
{
    double t;
    t=sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
    return t;
}
int main()
{
    double sum=0,min1=10000000,t;
    int i,j,n,u;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
      scanf("%lld%lld",&x[i],&y[i]);
    min[1]=0;
    for(i=2;i<=n;i++)
      min[i]=10000000;
    for(i=1;i<=n;i++)
    {
      min1=10000000;
      for(j=1;j<=n;j++)
        if(vis[j]==0&&min[j]<min1)
          {
          min1=min[j];
          u=j;
          }
      vis[u]=1;
      sum+=min1;
      for(j=1;j<=n;j++)
      {
        t=cal(u,j);
        if(t<min[j])
          min[j]=t;
      }
    }
    printf("%.2f",sum);
    return 0;
}

洛谷1265

#include<stdio.h>
#include<stdlib.h>
int x[1000001]={0},y[1000001]={0},x1[1000001]={0},y2[1000001]={0},father[1000001]={0},b[1000001]={0};
float dis[1000001]={0};
void swap(int a,int b)
{
    float t;
    int t1;
    t=dis[a];dis[a]=dis[b];dis[b]=t;
    t1=x1[a];x1[a]=x1[b];x1[b]=t1;
    t1=y2[a];y2[a]=y2[b];y2[b]=t1;
    return;
}
int quicksort(int left,int right)
{
    int i,j;
    float mid;
    i=left;j=right;mid=dis[(i+j)/2];
    while(i<=j)
    {
    while(dis[i]<mid)  i++;
    while(dis[j]>mid)  j--;
      if(i<=j)
      {
      swap(i,j);
      i++;j--;
      }
    }
    if(i<right)  quicksort(i,right);
    if(j>left)   quicksort(left,j);
    return 0;
}
int find(int x)
{
    if(father[x]!=x)
      father[x]=find(father[x]);
    return father[x];
}
void unit(int r1,int r2)
{
    father[r2]=r1;
    return;
}
int main()
{
    int s,p,i,j,k=0,r1,r2,ans=0,ans2=0;
    float max=0;
    scanf("%d%d",&s,&p);
    for(i=1;i<=p;i++)
      scanf("%d%d",&x[i],&y[i]);
    for(i=1;i<=p;i++)
      for(j=1;j<i;j++)
        if(i!=j)
        {
        k++;
        dis[k]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
        x1[k]=i;
        y2[k]=j;
        }
    quicksort(1,k);
    for(i=1;i<=k;i++)
      father[i]=i;
    for(i=1;i<=k;i++)
    {
    r1=find(x1[i]);r2=find(y2[i]);
    if(r1!=r2)
      {
      ans++;
      max=dis[i];
      unit(r1,r2);
      }
    if(ans>=p-s)
        break;
    }
    printf("%.2f",max);
    return 0;
}

kruskal 洛谷1991

猜你喜欢

转载自blog.csdn.net/qq_40892508/article/details/82557714