1 条题解
-
0
#include <bits/stdc++.h> #define int long long #define mk make_pair #define PII pair<int,int> #define FOR(i,j,k) for(int i=(j);i<=(k);++i) #define ROF(i,j,k) for(int i=(j);i>=(k);--i) #define FOI(a,b) for(auto a : b) #define wh while #define inf 0x3f3f3f3f3f3f3f3f #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define snd second #define fst first #define pb push_back #define CI const int #define NP namespace using NP std; int quickpow(int a,int b) { int ans=1; wh(b) { if(b&1)ans=ans*a; a=a*a; b>>=1; } return ans; } CI MAXN=1e3+5; struct node { int x,y,z; }a[MAXN]; double ans=inf; int door[MAXN],f[MAXN],n,m; int find(int x) { if(x==f[x])return x; return f[x]=find(f[x]); } void merge(int x,int y) { int fx=find(x),fy=find(y); if(fx==fy)return; f[fy]=fx; } vector<pair<int,int>>v; double getdist(node a,node b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)); } signed main(void) { freopen("cube.in","r",stdin); freopen("cube.out","w",stdout); cout<<fixed<<setprecision(4); IOS cin>>n>>m; FOR(i,1,n) { cin>>a[i].x>>a[i].y>>a[i].z>>door[i]; } FOR(i,1,m) { int u,v_; cin>>u>>v_; v.pb({u,v_}); } vector<int> high; FOR(i,1,n) { high.pb(a[i].z); } sort(high.begin(),high.end()); high.erase(unique(high.begin(),high.end()),high.end()); FOI(hi,high) { if(hi<a[1].z||hi<a[n].z)continue; FOR(i,1,n)f[i]=i; vector<bool>ok(n+1); FOR(i,1,n) { if(a[i].z<=hi)ok[i]=1; } FOI(s,v) { if(ok[s.fst]&&ok[s.snd]) { merge(s.fst,s.snd); } } vector<int> alldoor(n+1); vector<int> po; FOR(i,1,n) { int fi=find(i); if(fi==i)po.pb(i); alldoor[fi]+=door[i]; } int fs=find(1); int fe=find(n); if(fs==fe) { ans=min(ans,0.3*alldoor[fs]); continue; } if(alldoor[fs]<1||alldoor[fe]<1)continue; vector<vector<double>>dist(n+1,vector<double>(n+1,inf)); FOR(i,1,n) { if(!ok[i])continue; FOR(j,1,n) { if(!ok[j])continue; int l=find(i); int r=find(j); if(l==r)continue; if(dist[l][r]>getdist(a[i],a[j])) { dist[l][r]=getdist(a[i],a[j]); dist[r][l]=getdist(a[i],a[j]); } } } priority_queue<pair<double,int>,vector<pair<double,int>>,greater<> > q; vector<double> d(n+1,inf); vector<double> st(n+1); d[fs]=alldoor[fs]*0.3; q.push({d[fs],fs}); wh(q.size()) { pair<double,int> front=q.top(); double di=front.fst; int p=front.snd; q.pop(); if(st[p])continue; st[p]=1; FOI(s,po) { if(p!=fs)if(alldoor[s]<1 || alldoor[p]<1)continue; else if(alldoor[s] <1 || alldoor[p]<2)continue; if(d[s]>d[p]+(dist[p][s]-0.6)+alldoor[s]*0.3) { // cout<<p<<" "<<s<<endl; // cout<<d[p] <<" "<<dist[p][s]-0.6<<" "<<alldoor[s]*0.3<<endl; d[s]=d[p]+(dist[p][s]-0.6)+alldoor[s]*0.3; q.push({d[s],s}); } } } ans=min(ans,d[fe]); } if(ans>=inf/2)cout<<"impossible"; else cout<<ans; return false; }
信息
- ID
- 7225
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- (无)
- 递交数
- 13
- 已通过
- 2
- 上传者