借鉴博客:https://www.cnblogs.com/zhangjiuding/p/9112273.html

986-A. Fair

/* 986-A-Fair,codeforce;
大致题意:
      n个点,m个双向边; 一共K中食品,每个点只能提供1种;至少携带s种不同的食品,点u->v 需要花费d(u,v);d(u,v)是最短路u->v,的开销——开销等于该最短路的路径中的边数。每个点有一种食品,食品总的种类数不超过K个,求从每个点出发找至少种食品的最小开销。题目看着像是最短路,起个名字叫做类最短路题目!
大致思路:
      直接进行裸的bfs,我的第一次的做法是枚举每个点作为单源点进行bfs的,这样时间复杂度最大为:(10^5)*(10^5)=顶点数*边数!尽管k只有100个,按理说找100个点不就够了-但可能出现极端情况,比如某几个点特别离散——很偏僻需要搜完整个图才可以找到,这样整个图的复杂度就上升很多了!
     怎么解决呢?再次审题找到突破口,k=100,然后就需要从突破口开始这k种食品的地方进行bfs,每次bfs某一种型号的食品——将该种型号食品的产地作为bfs的起点——更省时!复杂度为k*(10^5)=k *顶点数,及从每种食品开始bfs搜索完整个图存进d[][]中!
*/
 #define N 100008
int a[N];
vector<int>G[N];
int d[N][];//更新每个小镇到第i种食物的最小距离 void init(int n){
for(int i=;i<=n;i++)
G[i].resize();
}
bool vis[N]; bool used[N];
void bfs(int k,int n){
queue<int>Q;
for(int i=;i<=k;i++){//暴力枚举第i种物品的源点,从每种物品的源点开始进行bfs!更省时!
memset(used,false,sizeof(used));
for(int j=;j<=n;j++){
if(a[j]==i){
d[j][i]=;
Q.push(j);
used[j]=true;
}
}
while(Q.size()>){//进行BFS!
int x=Q.front();
Q.pop();
for(int t=;t<(int)G[x].size();t++){
int v=G[x][t];
if(!used[v]){
d[v][i]=d[x][i]+;//bfs记录节点
used[v]=true;
Q.push(v);
}
}
}
}
} int main(){
int n,m,k,s; while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF){
init(n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
int x,y;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
bfs(k,n); for(int i=;i<=n;i++){
sort(d[i]+,d[i]++k);
int ans=;
for(int j=;j<=s;j++){
ans+=d[i][j];
}
printf("%d ",ans);
}
cout<<endl;
}
return ;
}
 

【反向多源点同时BFS一个强连通图+类最短路题面】Fair-986C-Codeforce的更多相关文章

  1. hdu1269迷宫城堡(判断有向图是否是一个强连通图)

    1 /* 题意: 给你一个图,求这个有向图示否是一个强连通图(每两个节点都是可以相互到达的)! 思路1:按正向边dfs一遍,将经过的节点计数,如果记录的节点的个数小于n,那么就说明图按照正向边就不是连 ...

  2. CSS3的一个伪类选择器:nth-child()

    CSS3的一个伪类选择器“:nth-child()”. Table表格奇偶数行定义样式: 语法: :nth-child(an+b) 为什么选择她,因为我认为,这个选择器是最多学问的一个了.很可惜,据我 ...

  3. PHP用单例模式实现一个数据库类

    使用单例模式的出发点: 1.php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源. 2.如果系统中需要有一个类来全局控制某些 ...

  4. 使用代码向一个普通的类注入Spring的实例

    转载请在页首注明作者与原文地址 一:应用场景 什么是普通的类,就是没有@Controller,@Service,@Repository,@Component等注解修饰的类,同时xml文件中,也没有相应 ...

  5. 一个Java文件至多包含一个公共类

    编写一个java源文件时,该源文件又称为编译单元.一个java文件可以包含多个类,但至多包含一个公共类,作为编译时该java文件的公用接口,公共类的名字和源文件的名字要相同,源文件名字的格式为[公共类 ...

  6. 一个java源文件中为什么只能有一个public类。

    我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个publi ...

  7. 很久以前写的一个 ShareRestrictedSD 类

    代码中一开始的 几个 USES 单元,可能是多余的. unit ShareRestrictedSD; interface uses Windows, Messages, SysUtils, Class ...

  8. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  9. Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循

    第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private do ...

随机推荐

  1. Ubuntu linux 下的基本操作

    防火墙相关: 关闭防火墙: ufw disable

  2. laravel的定时任务

    首先在laravel项目命令创建: php artisan make:command TestCommand 会在App\Console\Commands文件下看到TestCommand.php文件, ...

  3. selenium + python 环境配置 (四)之启动Firefox

    火狐浏览器自身适配selenium   因此不需要再安装 直接代码启动: __author__ = 'admin' #作者 # -*- coding:utf-8 -*- # 建议所有都加编码 from ...

  4. UiPath工具取得网页上面的数据,写入到csv,Outlook邮件发送

    问题描述: 想取得网页上面的股票价格,之后写入到csv文本里面之后添加附件发送邮件. 解决方法: 利用UIPath工具来取得数据,之后写入再发送. 具体步骤: 1.打开网页,之后找到所显示的股票行情的 ...

  5. VMware中 CentOs虚拟机的安装教程

    首先点击创建新的虚拟机 选择典型安装,点击下一步 这里我们选择稍后安装操作系统,然后点击下一步 这里我们操作系统选择Linux操作系统,版本选择CentOs 7 64位,然后点击下一步 这里我们可以修 ...

  6. 关于c++模板非类型参数中指针和引用类型必须为全局或者静态变量的问题

    之前在学习c++模板的时候,一直没留意到在非类型参数中对指针和引用有着一些限制,今早在复学模板的时候才注意到书上标明,指针和引用作为模板的非类型参数传递时必须要求是全局或者静态变量.其实不难想到,模板 ...

  7. 1201: 位运算之拼整数(Java)

    WUSTOJ 1201: 位运算之拼整数 题目 原题链接 参考博客 XXXXXyun的博客--输入十六进制数 Description 输入无符号短整数k[hex.]和p[oct.],将k的高字节作为结 ...

  8. prometheus+grafana+Alertmanager邮箱告警

    环境 系统:CentOS 7 软件:alertmanager-0.18.0.linux-amd64.tar.gz 安装 下载二进制包 地址:https://prometheus.io/download ...

  9. Redis键的序列化和反序列化

    序列化 命令名称:DUMP 语法:DUMP key 功能:序列化给定key,并返回被序列化的值.序列化的值不包括任何生存时间信息. 返回值:如果key不存在,那么返回nil.否则返回序列化之后的值 反 ...

  10. 谈jdbcTemplate与mybatis

    为什么会产生 Hibernate Mybatis 这类的dao层框架 传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的 ...