POJ 2349 克鲁斯卡尔和Prime算法

给N个点的坐标,若2点之间距离小于D,则2点联通。

生成最小生成树,减去卫星的数量条最大边, 剩余的最大边的长度即为所求的最小D


克鲁斯卡尔算法求最小生成树

#include
#include
#include
#include
using namespace std;


const int MAX = 505;
int Count;
int father[MAX];
double edgeLength[MAX];
struct Edge
{
    int start;
    int end;
    double length;
}edge[MAX*MAX];


int pointX[MAX],pointY[MAX];


bool cmp(Edge a,Edge b)
{
    return a.length < b.length;
}


int find(int x)
{
    if(father[x] == x)
        return x;
    else
        return find(father[x]);
}


bool Union(int start,int end)
{
    int x = find(start);
    int y = find(end);
    if(x==y)
        return false;
    if(x         father[y] = x;
    else
        father[x] = y;
    return true;
}


void Kruskal(int p)
{
    sort(edge,edge+Count,cmp);
    int j = 0;
    for(int i = 0;i     {
        father[i] = i;
    }
    for(int i = 0;i     {
        if(Union(edge[i].start,edge[i].end))
        {
            edgeLength[j] = edge[i].length;
            j++;
        }
    }
}


double getLength(int x1,int y1,int x2,int y2)
{
    return sqrt((double)(1.0*(x1-x2)*(x1-x2)+1.0*(y1-y2)*(y1-y2)));
}
int main()
{
    int T,S,P;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&S,&P);
        Count = 0;
        for(int i = 0;i         {
            scanf("%d %d",&pointX[i],&pointY[i]);
        }
        for(int i = 0;i             for(int j = i+1;j             {
                edge[Count].start = i;
                edge[Count].end = j;
                edge[Count].length = getLength(pointX[i],pointY[i],pointX[j],pointY[j]);
            }
        Kruskal(P);
        printf("%.2lf\n",edgeLength[P-S-1]);
    }
    return 0;
}


prime算法

#include
#include
#include
#include
using namespace std;


const int MAX = 505;
int MIN = 100000000;
double G[MAX][MAX];
int pointX[MAX],pointY[MAX];
double dis[MAX];
double edgeLength[MAX];


bool visit[MAX];


void init()
{
    for(int i = 0;i        {
          visit[i] = false;
          edgeLength[i] = 0;
          for(int j = i;j             G[i][j] = G[j][i] = MIN;
       }
       visit[MAX-1]=false;
       edgeLength[MAX-1] = 0;
}


double getLength(int x1,int y1,int x2,int y2)
{
    return sqrt((double)(1.0*(x1-x2)*(x1-x2)+1.0*(y1-y2)*(y1-y2)));
}


void Prime(int n)
{
    for(int i = 1;i         dis[i] = G[0][i];
    visit[0] = true;
    for(int i = 1;i     {
        double temp = MIN - 1;
        int record = -1;
        for(int j = 1;j         {
            if(visit[j]==false&&dis[j]             {
                temp = dis[j];
                record = j;
            }
        }
        visit[record] = true;
        edgeLength[i-1] = temp;
        for(int j = 1;j         {
            if(visit[j]==false&&G[record][j]             {
                dis[j] = G[record][j];
            }
        }
    }
}


int main()
{
    int T,P,S;
    scanf("%d",&T);
    while(T--)
    {
        init();
        scanf("%d %d",&S,&P);
        for(int i = 0;i         {
            scanf("%d %d",&pointX[i],&pointY[i]);
        }
        for(int i = 0;i             for(int j = i+1;j             {
                G[i][j] = G[j][i] = getLength(pointX[i],pointY[i],pointX[j],pointY[j]);
            }
        Prime(P);
        sort(edgeLength,edgeLength+P-1);
        printf("%0.2lf\n",edgeLength[P-S-1]);
    }
    return 0;
}

你可能感兴趣的:(ACM,图论)