POJ2728 Desert King árbol de expansión de relación óptima

Al principio, no entendía por qué el árbol de expansión de proporción óptima debería usar el árbol de expansión mínimo.
El libro habla sobre el árbol de extensión máximo. Pensé que era el árbol de extensión máximo al principio, pero este es el valor máximo del valor legal, no el valor mínimo en el tema. Más tarde, descubrí que se trataba de un malentendido en el significado de la dicotomía de planificación 0/1.
En una respuesta binaria general, por ejemplo, la función disminuye monótonamente,> 0 no es una solución, <0 es una solución y = 0 es el valor máximo en la solución que podemos requerir. Pero para la planificación 0/1, la dicotomía es la única solución, las soluciones> 0 y <0 no son soluciones, y solo la solución con = 0 es la solución.
Establezcamos la razón de dos puntos a kkk ,xx paraárbolesx significa que el árbol de expansión mínimo esxmin x_ {min}Xm i nIndica que el árbol de expansión máximo es xmax x_ {max}Xm un xMedias, F (k, x) = costo (x) - k ∗ dis (x) F (k, x) = costo (x) -k * dis (x)F ( k ,x )=c o s t ( x )-kd i s ( x ) . Arreglar un árbolxxxF (k, x) F (k, x)F ( k ,x ) es inversamente proporcional akkkF (k, x) = 0 F (k, x) = 0F ( k ,x )=0 dekkk es una solución positiva. F (k, x) <0 F (k, x) <0F ( k ,x )<En 0 , significa que la relación de este árbol es mayor quekkk小 ;F (k, x)> 0 F (k, x)> 0F ( k ,x )>En 0 , significa que la relación de este árbol es mayor quekkk es grande.

En el proceso de dicotomía, si solo se garantiza F (k, xmax) = 0, F (k, x_ {max}) = 0F ( k ,Xm un x)=0, 那么F (k, xmin) <F (k, xmax) F (k, x_ {min}) <F (k, x_ {max})F ( k ,Xm i n)<F ( k ,Xm un x), 即F (k, xmin) <0 F (k, x_ {min}) <0F ( k ,Xm i n)<0 , luegoxmin x_ {min}Xm i nLa relación es obviamente más alta que kkk es pequeño, entonceskkk necesita seguir dicotomia. (Kken este momentok es en realidad el valor máximo de la relación. )

Código AC:

#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <iomanip>
#include <cstdlib>
#include <stack>
#include <cstring>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i<(b);i++)
#define lep(i,a,b) for(int i=(a);i>=(b);i--) 
#define lepp(i,a,b) for(int i=(a);i>(b);i--)
#define sci(x) scanf("%d",&(x))
#define scl(x) scanf("%lld",&(x))
#define scs(x) scanf("%s",(x))
#define pri(x) printf("%d\n",(x))
#define prl(x) printf("%lld\n",(x))
#define prs(x) printf("%s\n",(x))
#define pdi pair<double,int>
#define pll pair<long long,long long>
#define mp make_pair
#define All(x) x.begin(),x.end() 
#define ms(a,b) memset(a,b,sizeof(a)) 
#define INF 0x3f3f3f3f
#define INFF 0x3f3f3f3f3f3f3f3f
#define multi int T;scanf("%d",&T);while(T--) 
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e3+5;
const int mod=1e9+7;
const db eps=1e-6;                                                                            
const db pi=acos(-1.0);
int n,vis[N];
db z[N][N],w[N][N],v[N][N],dis[N];
struct location{
    int x,y,z;
}c[N];
inline db cal(db a,db b){
    return a*a+b*b;
} 
int main(){
    #ifndef ONLINE_JUDGE
    freopen("D:\\work\\data.in","r",stdin);
    #endif
    while(cin>>n&&n){
        rep(i,1,n){
            cin>>c[i].x>>c[i].y>>c[i].z;
            rep(j,1,i-1){
                z[i][j]=abs(c[i].z-c[j].z);
                w[i][j]=sqrt(cal(c[i].x-c[j].x,c[i].y-c[j].y));
            }
        }
        db l=0,r=100;
        while(r-l>eps){
            db mid=(l+r)/2.0;
            rep(i,1,n){
                dis[i]=1e17;
                rep(j,1,i-1) v[i][j]=v[j][i]=z[i][j]-mid*w[i][j];
                vis[i]=0;
            }
            dis[1]=0;
            db tmp=0,mindis=1e17;
            int pos;
            rep(i,1,n){
                mindis=1e17;
                rep(j,1,n){
                    if(vis[j]) continue;
                    if(dis[j]<mindis){
                        mindis=dis[j];
                        pos=j;
                    }
                }
                tmp+=dis[pos];
                vis[pos]=1;
                rep(j,1,n)
                    if(vis[j]==0&&dis[j]>v[pos][j]) 
                        dis[j]=v[pos][j];
            }
            if(tmp>=0) l=mid;
            else r=mid;
        }
        cout<<fixed<<setprecision(3)<<l<<endl;
    }
}

Supongo que te gusta

Origin blog.csdn.net/Luowaterbi/article/details/112971587
Recomendado
Clasificación