HDU1875 aplazó para acelerar el proyecto (para incluir todos los puntos, expansión mínima de Kruskal árbol)

Descripción del problema
creo que todos hemos escuchado de un lugar "Cien Island Lake," la barra, los residentes de cien islas del lago viven en diferentes islas, cuando quieren ir a deben ser alcanzados a través de la planificación de otras islas en barco. Ahora, el gobierno decidió desarrollar las cien islas del lago, primero debemos resolver el problema del desarrollo, por supuesto, es el problema de tráfico, el gobierno decidió llevar a cabo un total de cien islas sin obstáculos del lago! Después RPRush equipo de inspección de la situación para entender completamente las cien islas del lago, decidió construir un puente entre el cumplimiento de las condiciones de la isla, el llamado cualificado, es decir, la distancia entre las dos islas no puede ser inferior a 10 metros, no puede ser superior a 1000 metros. Por supuesto, con el fin de ahorrar dinero, no son solamente necesarios para lograr entre dos caminos conducen a la isla. Que puentean el precio es de 100 yuanes / m.

De entrada
de entrada incluye una pluralidad de conjuntos de datos. Que comprende una primera entrada de número entero T (T <= 200), datos representativos de un grupo-T.
Cada conjunto de datos es un primer número entero C (C <= 100), representativa del número de la isla, seguido coordinar el grupo C, las coordenadas representativas de cada isla, estas coordenadas son 0 <= x, y <= 1000 número entero.

Salida de
cada línea de salida de los datos de entrada, que representan el coste mínimo del puente, el resultado a un decimal. Si no puede realizar el proyecto con el fin de alcanzar el pleno flujo, la salida "oh!".

Ejemplo de entrada
2
2
10 10
20 20
3
1 1
2 2
1 000 1 000

Ejemplo de salida
1414.2
oh!

Algunos pequeños defectos, pero siento que podría escribir, ha sido bastante bueno

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
//百鸟湖,这道题的难点在于,他给了的是每一个小岛的坐标,
//我的想法就是,用两次for循环遍历所有的岛之间的距离,然后用一个结构体数组来存储,然后进行排序和计算(套用模板)
//还有个条件是两岛之间的距离是有一个范围的,那就需要一个判断函数,我是这么想的
//创建一个结构体数组来存储岛的坐标
//然后把第一个小岛位置设置为0 第二个设置为1 依次下去 用两次for循环 暴力求解岛与岛之间的距离 然后用一个结构体数组存,起点就是1 终点就是2 距离就是求解
struct D{
   double x,y;
}Dao[100];
struct W{
    int s,e;//起点,终点,距离
    double dis;
}Way[100];
int a[100];
int zuzong(int x){
    if(a[x]==x)
        return x;
    else
        return zuzong(a[x]);
}
bool check(int x,int y){
    return zuzong(x)==zuzong(y);
}
void merge1(int x,int y){
    a[zuzong(x)]=zuzong(y);
}
//再写一个方法求距离
double Jli(double x1,double y1,double x2,double y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
//再写一个比较函数,是按照距离从小到大
bool cmp(W a,W b){
    return a.dis<b.dis;
}
int main(){
    int t,c,i,j;
    int num=0;//这个代表小岛的边
   double cos=0;//这个是最后的花销
    scanf("%d",&t);
    while(t--){
        int count1=0;//做记录
        //输入小岛个数
        scanf("%d",&c);
        //依次输入小岛坐标
        for(i=1;i<=c;i++)
            scanf("%lf%lf",&Dao[i].x,&Dao[i].y);
        //现在开始以小岛为单位开始求各个的距离
        for(i=1;i<=c;i++)
            for(j=i+1;j<=c;j++){
                    //用第二个结构体数组来记录位置和开始与最后的结点
                Way[num].s=i;
                Way[num].e=j;
                Way[num].dis=Jli(Dao[i].x,Dao[i].y,Dao[j].x,Dao[j].y);
                num++;//边数量加一
            }

        //就要开始了,现在的情况是,有num条边,从0开始的,而且现在要做的应该是,把数组按照长度排序
        sort(Way,Way+num,cmp);
        //然后就是对a进行初始化
        for(i=1;i<=c;i++)
            a[i]=i;
        //就要开始操作了,对每一条边
        for(i=0;i<num;i++){//如果这条边的开始和结束没被访问过,并且,他们的距离在那个范围之内
            if(!check(Way[i].s,Way[i].e)&&(Way[i].dis>10)&&(Way[i].dis<1000)){
                //这样的满足条件的话
                cos+=Way[i].dis*100;//按照题意
                //然后合并起来
                merge1(Way[i].s,Way[i].e);
                count1++;
            }
        }
        if(count1==c-1)//因为最小生成树 ,边数是等于顶点数减去1
            printf("%.1f\n",cos);
        else
            printf("oh!\n");

    }


}

Publicado 72 artículos originales · ganado elogios 5 · Vistas 2794

Supongo que te gusta

Origin blog.csdn.net/qq_41115379/article/details/105006912
Recomendado
Clasificación