1 条题解

  • 0
    @ 2026-8-9 11:33:30
    #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;
    }
    
    
    
    
    
    
    
    
    
    • 1

    信息

    ID
    7225
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    (无)
    递交数
    13
    已通过
    2
    上传者