【题意】:

有些公司将在Byteland举办公平的会议。Byteland的n个城镇,m条两镇之间的双向道路。当然,你可以使用道路从任一个城镇到达任何城镇。
有k种商品产自Byteland,并且每个城镇只生产一种类型。为了举办公平,你必须至少带来s种不同种类的商品。
【It costs d(u,v) coins to bring goods from town u to town v where d(u,v)d (u , v ) is the length of the shortest path from u to v .】
它花费货物从市区u到市区v的硬币成本为d(u,v),其中d(u,v)是从u到v的最短路的长度。
【Length of a path is the number of roads in this path.】
路径的长度是此路径中的道路数量。
主办单位将承担所有差旅费用,但他们可以选择城镇提货。现在他们想要计算在n个城镇举办公平的最低费用。
输入 城镇数量n,道路数量m,不同类型商品的数量k,持有公平所需的不同类型商品的数量s。
其中ai 是第i个城镇生产的商品类型。确保1和k之间的所有整数在整数ai中至少出现一次。
通过这条路相连的城镇。保证每两个城镇之间不超过一条公路。保证您可以通过道路从任何城镇到任何其他城镇。
打印n个数,其中第i个数是您需要花费在旅行费用上的最小数量的硬币用空格分隔数字。

【分析】:我们要另辟蹊径,从k种不同类型的商品为起点进行BFS,然后求k个点到不同城镇的最短路径,为什么呢?因为k最多100种,如果从城镇为起点BFS,那么1e5的决策次数是会T的。

【代码】:

#include <iostream>
#include<queue>
#include<string.h>
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define M 2005
const int INF = 0x3f3f3f3f;
#define rep(i,a,b) for(int i=(a); i<(b); i++)
#define ll long long
int n,m,k,s,u,v;
int a[N];
vector<int> G[N];
int d[N];
int dis[105][N];//dist[i]是源到i的目前最短路长度 void bfs(int st)
{
queue<int> q;
for(int i=1;i<=n;i++)
{
if(a[i]==st) //起点等于某一类(枚举k个商品)
{
dis[st][i]=0;
q.push(i); //记录下标
}
}
while( !q.empty() )
{
//每次迭代,取出队头的点u,依次枚举从u出发的边
int u=q.front();q.pop();
for(int i=0; i<G[u].size(); i++)
{
int v=G[u][i];
//若dis[v]+1 < dis[v],则改进dis[v]
if(dis[st][v] > dis[st][u] + 1)
{
dis[st][v] = dis[st][u] + 1;//没判队列里是否已经有v,可能会慢一些
q.push(v); //此时由于st到v的最短距离变小了,有可能v可以改进其它的点,所以若v不在队列中,就将它放入队尾
} //这样一直迭代下去直到队列变空,也就是S到所有节点的最短距离都确定下来,结束算法
}
}
}
int main()
{
memset(dis,120,sizeof(dis));
scanf("%d%d%d%d",&n,&m,&k,&s);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1; i<=k; i++) bfs(i);//从k个不同类型点枚举,保存dis最短路径
for(int i=1; i<=n; i++)
{ for(int j=1; j<=k; j++) d[j]=dis[j][i];
sort(d+1,d+k+1);
long long ans=0;
for(int j=1; j<=s; j++) ans+=d[j];
cout << ans << ' ';
}
cout<<endl;
}

CF986A Fair【图论/BFS】的更多相关文章

  1. CF986A Fair

    题目描述 Some company is going to hold a fair in Byteland. There are n n n towns in Byteland and m m m t ...

  2. 数据结构之 图论---bfs(邻接表)

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...

  3. 图论-BFS解无权有向图最短路径距离

    概述 本篇博客主要内容: 对广度优先搜索算法(Breadth-First-Search)进行介绍: 介绍用邻接表的存储结构实现一个图(附C++实现源代码): 介绍用BFS算法求解无权有向图(附C++实 ...

  4. 图论 --- BFS + MST

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7844   Accepted: 2623 Descrip ...

  5. 图论--BFS总结

    1.关于BFS的Key_word: ①hash或状态压缩记录状态  ②状态剪枝 ③反向BFS ④双向BFS ⑤特殊初始化VIS数组 ⑥动态图的搜索 ⑦优先队列优化搜索 ⑧数位搜索 下面是一一讲解: 1 ...

  6. 算法基础⑦搜索与图论--BFS(宽度优先搜索)

    宽度优先搜索(BFS) #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  7. NOIP前刷题记录

    因为本蒻实在太蒻了...对于即将到来的NOIP2018ssfd,所以下决心要把自己近期做过的题目(衡量标准为洛谷蓝题难度或以上)整理一下,归归类,简单地写一下思路,就当作自己复习了吧qwq 本随笔持续 ...

  8. NOIP刷题

    搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...

  9. CodeForces Round #285 Div.2

    C.Misha and Forest (图论 BFS) 比赛进行了一半才想起来有场CF没打,=_=|| 前两道题快速切掉,C题一直卡没什么好的思路 憋了几天,忍不住偷偷瞄了一下别人AC的代码,发现我题 ...

随机推荐

  1. ubuntu上通用解压方式

    ubuntu上通用解压方式 tar xvf *.bin.tar.gz,gz,tar.tgz

  2. python-压缩解压

    压缩解压包 #导入模块 import zipfile #新建压缩包并将db与ooo.xml压缩到文件中 z = zipfile.ZipFile('laxi.zip','w') z.write('db' ...

  3. C++ Primer 第2章 变量和基本类型

    C++ Primer 第2章 变量和基本类型 C Primer 第2章 变量和基本类型 1 基本内置类型 算数类型 类型转换 字面值常量 2 变量 变量定义 3 复合类型 引用d左引用 指针d 4 c ...

  4. python 读取consul配置

    自动化通过rcp client调用远端服务接口时,都需要将远端测试服务ip.端口记录在配置文件. 但由于,服务发布或重启会导致ip.端口变动. 以下将通过python-consul 自动去读取cons ...

  5. foreach的理解

    foreach的两种写法的解读 一.常见 1.理解:将数组元素逐个赋值给变量V,然后将v输出 2.代码: $arr = array(1,2,3,4,5); foreach($arr as $a){ e ...

  6. html5 download blob

    html5 download blob https://stackoverflow.com/questions/19327749/javascript-blob-filename-without-li ...

  7. easyui中的依赖关系

    参考自:http://www.easyui.info/archives/765.html 在使用easyui的过程中发现各个组件直接存在依赖关系,也就是上层的复杂组件依赖于一个或者多个简单组件,复杂组 ...

  8. [bzoj3218] a+b problem [最小割+数据结构优化建图]

    题面 传送门 思路 最小割 我们首先忽略掉那个奇♂怪的限制,就有一个比较显然的最小割模型: 建立源点$S$和汇点$T$ 对于每个元素$i$建立一个点$i$,连边$<S,i,w[i]>$和$ ...

  9. gulp技巧总结

    1. gulp.dest 会自动创建目录 gulp.dest(dir),若dir不存在,gulp会自动创建它 2. gulp.src copy具名路径(即不子目录**的路径)的文件,不会保留文件夹路径 ...

  10. 使用jdk中的java.sql包中的方法进行jdbc连接

    首先说明用 java.sql包进行jdbc连接的步骤: 1.加载数据库的驱动.(一般是oracle和mysql,oracle的数据驱动名是:Oracle.jdbc.driver.OracleDrive ...