题意:给N个点,还有另外m个点(当中仅仅能选K个)。求最短路。

思路:在SPFA的基础上,用一个数组来统计,在某点入队时(要拓展其它点了),若该点是m个点中的,则count【i】=原来的+1;若不是。则继承原来的。出队时候限制一下。若大于K了,就停止拓展。

原题:眼下在一个非常大的平面房间里有 n 个无线路由器,每一个无线路由器都

固定在某个点上。不论什么两个无线路由器仅仅要距离不超过 r 就能互相建立网

络连接。

除此以外。另有 m 个能够摆放无线路由器的位置。你能够在这些位置

中选择至多 k 个增设新的路由器。

你的目标是使得第 1 个路由器和第 2 个路由器之间的网络连接经过尽

量少的中转路由器。

请问在最优方案下中转路由器的最少个数是多少?

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct points
{
int x,y;
};
const int inf=0x3f3f3f3f;
int n,m,k,r;
vector<points>v; //点
int map[205][205]; //图
int dis(points a,points b) //距离
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void get_gra() //建图
{
for(int i=0;i<n+m;i++)
{
for(int j=i+1;j<n+m;j++)
{
if(dis(v[i],v[j])<=r*r)
{
map[j][i]=map[i][j]=1;
}
else
{
map[i][j]=map[j][i]=inf;
}
}
}
}
int inq[205];
int d[205];
int count[205];
void spfa()
{
queue<int>q;
for(int i=0;i<n+m;i++)
{
count[i]=inq[i]=0;
d[i]=inf;
}
q.push(0);inq[0]=1;d[0]=0;
while(!q.empty())
{
int cur=q.front();
q.pop();inq[cur]=0;
if(count[cur]>k)continue; //限制。某点出队的次数
for(int i=0;i<n+m;i++)
{
if(d[i]>d[cur]+map[cur][i])
{
d[i]=d[cur]+map[cur][i];
if(inq[i]==0)
{
if(i>=n) //被限制次数的点,若是经过该点(该点入队),则加
{
count[i]=count[cur]+1;
}
else //一般的点继承
{
count[i]=count[cur];
}
inq[i]=1;
q.push(i);
}
}
} } }
int main()
{
while(cin>>n>>m>>k>>r)
{
v.clear();
points temp;
for(int i=0;i<n+m;i++)
{
cin>>temp.x>>temp.y;
v.push_back(temp);
}
get_gra();
spfa();
cout<<d[1]-1<<endl; //问的是中间有几个点
}
return 0;
}

最短路中部分点仅仅能从中随意选取K个问题的更多相关文章

  1. 最短路中部分点只能从中任意选取K个问题

    题意:给N个点,还有另外m个点(其中只能选K个),求最短路. 思路:在SPFA的基础上,用一个数组来统计,在某点入队时(要拓展其他点了),若该点是m个点中的,则count[i]=原来的+1:若不是,则 ...

  2. 2019HDU多校第三场 K subsequence——最小费用最大流

    题意 给定一个 $n$ 个整数的数列,从中至多选取 $k$ 个上升子序列(一个元素最多被选一次),使得选取的元素和最大. 分析 考虑这个问题和经典网络流问题“最长不下降子序列”相似,我们考虑对这个建图 ...

  3. LeetCode382-链表随机节点

    原题链接:[382. 链表随机节点]:https://leetcode-cn.com/problems/linked-list-random-node/ 题目描述: 给定一个单链表,随机选择链表的一个 ...

  4. 仅仅有五行的Floyd最短路算法

    暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,例如以下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道随意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数 ...

  5. [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)

    以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt. 可是每当我们的工作人员把上百件的衣服从商店运回到赛场的 ...

  6. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

  7. HDU 2066-一个人的旅行(最短路Dijkstra)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. FZU2169:shadow(最短路)

    Problem Description YL是shadow国的国王,shadow国有N个城市.为了节省开支,shadow国仅仅有N-1条道路,这N-1条道路使得N个城市连通. 某一年,shadow国发 ...

  9. POJ--2449--Remmarguts&#39; Date【dijkstra_heap+A*】第K短路

    链接:http://poj.org/problem?id=2449 题意:告诉你有n个顶点,m条边.并把这些边的信息告诉你:起点.终点.权值.再告诉你s.t.k.需求出s到t的第k短路,没有则输出-1 ...

随机推荐

  1. Python 面试中 8 个必考问题(转载)

    Python 面试中 8 个必考问题 1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list ...

  2. hdu4587 TWO NODES

    问一个无向图中去掉任意两点后剩下的连通分量的个数最大值 枚举第一个删去的点,在剩下的子图中求割点 注意,剩下的子图可能不连通,那么就要对每个连通块求割点 计算删去一个点后剩余连通分量个数 left 的 ...

  3. nodejs vue SyntaxError:Block-scoped declarations (let,const,function,class) not yet supported

    下午在git上导入之前写的代码到本地环境,执行npm run dev报错. 在我之前的环境中是没有问题的,这个错误信息也没看懂是什么原因引起的, 猜测可能是nodejs版本太低,于是重新下载了一个wi ...

  4. Junit参数化测试Spring应用Dubbo接口

    一.创建基础类. package com.tree.autotest; import org.junit.Before;import org.springframework.context.annot ...

  5. Unity5.1 新的网络引擎UNET(九) UNET 官方推荐视频教程

    孙广东  2015.7.14 在新的网络引擎出现之前,Unity提供的是 内置 Raknet网络引擎, 这一次Unity想更新UGUI一样,花了大的手笔更新了, UNET. 原来的旧的网络组件 被提示 ...

  6. 算法笔记_159:算法提高 第二大整数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束.然后程序将从这组整数中,把第二大的那个整数找出来,并把它打印出来 ...

  7. 一步一步实现iOS微信自己主动抢红包(非越狱)

    前言:近期笔者在研究iOS逆向project,顺便拿微信来练手,在非越狱手机上实现了微信自己主动抢红包的功能. 题外话:此教程是一篇严肃的学术探讨类文章,只用于学习研究,也请读者不要用于商业或其它非法 ...

  8. Sybase数据库应用系统调优的五大领域

    Sybase数据库应用系统调优的五大领域 2011/3/14/13:49来源:慧聪it网 本 文以“某大型商业银行的网上银行系统”这一很具有典型意义的企业级大型Sybase数据库应用系统为例,涉及了数 ...

  9. shell脚本中执行mysql 语句,去除warning using a password on the command line interface can be insecure信息

    方法二:使用mysql参数的方法 mysql -u$user -p$pass -D $db -e "select host from user;"当然,可以通过将传参的方式来传递 ...

  10. java基础讲解05-----流程控制语句

    1.条件语句 语法 :  1.    if(表达式){语句块} 2.    if()                {                                    }else ...