「Luogu P1337」[JSOI2004]平衡点 / 吊打XXX 发表于 2018-11-05 | 字数统计: 353 | 阅读时长 ≈ 2 给定一些带权点,求它们的带权费马点。 链接Luogu P1337BZOJ 3680 题解这题备选的解很多,所以采用猜答案的方法模拟退火来做此题。注意下一些常数吧……我是不会告诉你我卡了7次的 代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485#include<bits/stdc++.h>using namespace std;typedef int ll;const ll MAXN=1e4+51;const double delta=0.997;struct Node{ double x,y,weight; };Node nd[MAXN];ll cnt;double resx,resy,res=1e18,t; inline ll read(){ register ll num=0,neg=1; register char ch=getchar(); while(!isdigit(ch)&&ch!='-') { ch=getchar(); } if(ch=='-') { neg=-1; ch=getchar(); } while(isdigit(ch)) { num=(num<<3)+(num<<1)+(ch-'0'); ch=getchar(); } return num*neg;}inline ll randInt(){ return 2*rand()-RAND_MAX;} inline double potentialEnergy(double x,double y){ double sum=0,xx,yy; for(register int i=0;i<cnt;i++) { xx=x-nd[i].x,yy=y-nd[i].y; sum+=sqrt(xx*xx+yy*yy)*nd[i].weight; } return sum;} inline void simulatedAnnealing(){ double x=resx,y=resy,rd,xx,yy,dt; t=19260; while(t>1e-18) { xx=resx+randInt()*t,yy=resy+randInt()*t; rd=potentialEnergy(xx,yy),dt=rd-res; if(dt<0) { x=xx,y=yy,resx=x,resy=y,res=rd; } else { if(exp(-dt/t)*RAND_MAX>rand()) { x=xx,y=yy; } } t*=delta; }}inline void SA(ll times){ for(register int i=0;i<times;i++) { simulatedAnnealing(); }}int main(){ srand(time(0)); cnt=read(); for(register int i=0;i<cnt;i++) { nd[i].x=read(),nd[i].y=read(),nd[i].weight=read(); } SA(9); printf("%.3lf %.3lf",resx,resy);} 本文作者: Karry5307 本文链接: http://karry5307.github.io/2018/11/05/「Luogu-P1337」-JSOI2004-平衡点-吊打XXX/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!