1 solutions

  • 0
    @ 2025-6-4 11:38:26

    类似分层图最短路的思想,将图分成 mm 层,每经过这 mm 个路由器之一,令层数加一。最终答案为到 0k0\sim k 层第 22 个路由器的距离的最小值。

    由于边权均为 11,直接 BFS 即可。

    (鄙人陋习,竞赛代码不空格)代码如下:

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    using namespace std;
    typedef pair<int,int> pii;
    int n,m,k,r,x[210],y[210];
    int dis[210][110];
    bool vis[210][110];
    inline bool check(int i,int j) {
    	return 1ll*(x[i]-x[j])*(x[i]-x[j])+1ll*(y[i]-y[j])*(y[i]-y[j])<=1ll*r*r;
    }
    inline void BFS() {
    	memset(dis,0x3f,sizeof dis);
    	queue<pii> q;q.push({1,0});vis[1][0]=1;dis[1][0]=-1;
    	while(!q.empty()) {
    		auto u=q.front();q.pop();
    		for(int i=1;i<=n+m;i++) {
    			if(!check(u.fi,i)) continue;
    			if(dis[i][u.se+(i>n)]>dis[u.fi][u.se]+1) {
    				dis[i][u.se+(i>n)]=dis[u.fi][u.se]+1;
    				if(!vis[i][u.se+(i>n)]) {
    					vis[i][u.se+(i>n)]=1;
    					q.push({i,u.se+(i>n)});
    				}
    			}
    		}
    	}
    }
    int main() {
    	scanf("%d%d%d%d",&n,&m,&k,&r);
    	for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
    	for(int i=1;i<=m;i++) scanf("%d%d",&x[i+n],&y[i+n]);
    	BFS();
    	int ans=n;
    	for(int i=0;i<=k;i++) ans=min(ans,dis[2][i]);
    	printf("%d\n",ans);
    	return 0;
    }
    
    • 1

    Information

    ID
    6
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    3
    Tags
    # Submissions
    6
    Accepted
    2
    Uploaded By