• 【ccf-csp题解】第1次csp认证-第四题-无线网络-题解


    题目描述

    思路讲解

    可以把题目抽象为:
    从第1个点到第2个点,经过特殊点的数量不超过k的单源最短路径(其中每条边的权重均为1)

    可以使用bfs解决这个问题,但是dist[][]数组和队列中放置的pair元素不再是单单的x和y,而是点的标号b和状态d

    所谓点的标号,可以事先创建一个PII point[N],这样一个下标就代表一个点

    状态的意思是:从1到点b总共经过了几个特殊点?

    举个栗子:

    dist[5][3]:从1到5经过了3个特殊点的最短路径

    由于r的限制,不是每一个都可以到达另一个点,那么这里就涉及一个技巧,即提前判断可以互相到达的点,然后把它们相连,最后就构造出一个互通且边权重为1的图

    1. for(int i=1;i<=n+m;i++)
    2. for(int j=1;j<=n+m;j++)
    3. if(check(i,j,r))//判断点i和点j距离是否小于等于r
    4. add(i,j),add(j,i);

    满分代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=210,M=N*N;
    6. int h[N],e[M],ne[M],idx;
    7. typedef long long LL;
    8. typedef pair<int,int>PII;
    9. PII p[N];
    10. int dist[N][N];
    11. int n,m,k,r;
    12. bool check(int i,int j,int r)
    13. {
    14. int dx=p[i].first-p[j].first;
    15. int dy=p[i].second-p[j].second;
    16. return (LL)dx*dx+(LL)dy*dy<=(LL)r*r;
    17. }
    18. void add(int a,int b)
    19. {
    20. e[idx]=b;ne[idx]=h[a];h[a]=idx++;
    21. }
    22. int bfs()
    23. {
    24. memset(dist,0x3f,sizeof dist);
    25. queueq;
    26. q.push({1,0});
    27. dist[1][0]=0;
    28. while(q.size())
    29. {
    30. auto t=q.front();
    31. q.pop();
    32. for(int i=h[t.first];i!=-1;i=ne[i])
    33. {
    34. int a=e[i],b=t.second;
    35. if(a>n)b++;
    36. if(b<=k)
    37. {
    38. if(dist[a][b]>dist[t.first][t.second]+1)
    39. {
    40. dist[a][b]=dist[t.first][t.second]+1;
    41. q.push({a,b});
    42. }
    43. }
    44. }
    45. }
    46. int res=1e8;
    47. for(int i=0;i<=k;i++)
    48. res=min(res,dist[2][i]);
    49. return res-1;
    50. }
    51. int main()
    52. {
    53. cin>>n>>m>>k>>r;
    54. memset(h,-1,sizeof h);
    55. for(int i=1;i<=n;i++)cin>>p[i].first>>p[i].second;
    56. for(int i=n+1;i<=n+m;i++)cin>>p[i].first>>p[i].second;
    57. for(int i=1;i<=n+m;i++)
    58. for(int j=1;j<=n+m;j++)
    59. if(check(i,j,r))//判断点i和点j距离是否小于等于r
    60. add(i,j),add(j,i);
    61. cout<<bfs()<
    62. return 0;
    63. }

  • 相关阅读:
    ROS1 LTS版本安装教程
    .NET周刊【6月第5期 2024-06-30】
    ATFX汇市:美元指数跌破关键支撑,黄金触及2000关口后回落
    SpringBoot自动装配原理及分析
    kubernetes(K8S)笔记
    kali linux安装redis
    cesium 自定义气泡 类
    赶紧进来看看---C语言实现学生信息管理系统(2.0动态内存版)
    Docker Compose映射卷的作用是什么,dockerfile这个文件有什么区别和联系?
    SpringClouldAlibaba 之 Sentinel流控规则同步到nacos(并重新生成镜像)
  • 原文地址:https://blog.csdn.net/m0_63222058/article/details/132714342