1 solutions
-
0
类似分层图最短路的思想,将图分成 层,每经过这 个路由器之一,令层数加一。最终答案为到 层第 个路由器的距离的最小值。
由于边权均为 ,直接 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