日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj1405-电缆建设【贪心,最小生成树】

發布時間:2023/12/3 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jzoj1405-电缆建设【贪心,最小生成树】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://jzoj.net/senior/#main/show/1405


題目大意

兩個平行于xxx軸的線上有若干個點,求連接所有點需要多少距離的線。


解題思路

在同一平行線上的相鄰的連邊,然后在不同的上面的話就離最近的兩個,跑最小生成樹即可。


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<cmath> #define sqr(x) (1ll*(x)*(x)) using namespace std; const int N=601000*2; struct node{int x,y;long long w; }a[N*2]; int n,m,x1,x2,fa[N],y[N],tot; double ans; int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f; } bool cmp(node x,node y) {return x.w<y.w;} int find(int x) {return (fa[x]==x)?x:(fa[x]=find(fa[x]));} int main() {n=read();m=read();x1=read();x2=read();for(int i=1;i<=n;i++)fa[i]=i,y[i]=y[i-1]+read();for(int i=n+1;i<=n+m;i++)fa[i]=i,y[i]=y[i-1]*(i!=n+1)+read();for(int i=1;i<n;i++)a[++tot]=(node){i,i+1,sqr(y[i+1]-y[i])};for(int i=n+1;i<n+m;i++)a[++tot]=(node){i,i+1,sqr(y[i+1]-y[i])};int l=n+1;for(int i=1;i<=n;i++){while(l<n+m&&y[l]<y[i]) l++;a[++tot]=(node){i,l,1ll*sqr(y[i]-y[l])+1ll*sqr(x1-x2)};if(l>n+1) a[++tot]=(node){i,l-1,1ll*sqr(y[i]-y[l-1])+1ll*sqr(x1-x2)}; }sort(a+1,a+1+tot,cmp);int z=n+m-1;for(int i=1;i<=tot;i++){int Fa=find(a[i].x),Fb=find(a[i].y);if(Fa==Fb) continue;ans+=sqrt(1.0*a[i].w);z--;fa[Fa]=Fb;if(!z) break;}printf("%.2lf",ans); }

總結

以上是生活随笔為你收集整理的jzoj1405-电缆建设【贪心,最小生成树】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。