[CF] 986 A. Fair

[CF] 986 A. Fair

大家好,又见面了,我是你们的朋友全栈君。

http://codeforces.com/problemset/problem/986/A

n个点的无向连通图,每个点有一个属性,求每个点到s个不同属性点的最短距离

 

依稀记得那天晚上我和Menteur-Hxy探讨这道题如何不可做的样子

直观想法当然是每个点出发bfs,找到s个就停止,但这最差是n^2的,不能接受!

解法是多源广搜,注意到货物种类非常小(<=100),所以可以求出每个点获得每种货物的最短距离。

做法是进行k次bfs,对于第i次,起点st是每个种类为i的点,广搜的性质决定了她们的平行关系。

这样就可以求出每种货物到每个点的距离,换言之,就是每个点获得每种货物的代价(最小)

然后对于每个点,答案就是最小的s个啦

 

无向图注意开两倍边

 

 

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

const int MAXN=100005;

inline int rd(){
  int ret=0,f=1;char c;
  while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
  while(isdigit(c))ret=ret*10+c-'0',c=getchar();
  return ret*f;
}

struct Edge{
  int next,to;
}e[MAXN<<1];
int ecnt,head[MAXN];
inline void add(int x,int y){
  e[++ecnt].to = y;
  e[ecnt].next = head[x];
  head[x] = ecnt;
}

int dis[MAXN][102],typ[MAXN];
//dis[i][j] - the minimum cost for town i to get the j-th goods

int n,m,k,s;

queue<int> Q;
void bfs(int x){
  for(int i=1;i<=n;i++) if(typ[i]==x) Q.push(i),dis[i][x]=0;
  while(!Q.empty()){
    int top=Q.front();Q.pop();
    for(int i=head[top];i;i=e[i].next){
      int v=e[i].to;
      if(dis[v][x]>dis[top][x]+1){
          dis[v][x]=dis[top][x]+1;
          Q.push(v);
      }
    }
  }
}

void init(){
  memset(dis,0x3f,sizeof(dis));
}

vector<int> V;

int main(){
  n=rd();m=rd();k=rd();s=rd();
  init();
  for(int i=1;i<=n;i++) typ[i]=rd();
  int x,y,w;
  for(int i=1;i<=m;i++){
    x=rd();y=rd();
    add(x,y);add(y,x);
  }
  for(int i=1;i<=k;i++) bfs(i);
  int ret=0;
  for(int i=1;i<=n;i++){
    V.clear();
    for(int j=1;j<=k;j++) V.push_back(dis[i][j]);
    sort(V.begin(),V.end());
    ret=0;
    for(int j=0;j<s;j++) ret+=V[j];
    printf("%d ",ret);
  }
  return 0;
}

 

转载于:https://www.cnblogs.com/ghostcai/p/9275282.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107434.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SAE J1939 – 简短介绍[通俗易懂]

    SAE J1939 – 简短介绍[通俗易懂]SAEJ1939–简短介绍在商用车辆领域,标准化的,串行的协议用于单个电子控制单元(ECU)和传动系统组件之间的通讯已有一段时间。通过使用标准化的串行协议,可具有以下优势:组件制造商只需要采用一个协议;这主要是商用车辆才会涉及的问题,因为生产量低。商用车辆制造商可依靠不同供应商的组件。可确保组件之间的互操作性,来自不同制造商的组件不用调整就可一同工作。由国际汽车工程师协会…

    2022年5月1日
    55
  • native2ascii用法

    native2ascii用法背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码。原因是java默认的编码方式为Unicode,而我们的计算机系统编码常常是GBK等编码。需要将系统的编码转换为java正确识别的编码问题就解决了。 1、native2ascii简介:native2ascii是s…

    2025年10月30日
    3
  • Hibernate缓存机制和MyBatis缓存机制

    Hibernate缓存机制和MyBatis缓存机制Hibernate缓存机制和MyBatis缓存机制

    2022年4月23日
    36
  • 2020-10-24 今年的1024

    2020-10-24 今年的1024作为一个伪程序员,写下自己的感受吧1.想靠编程这个饭碗吃饭,就要把这个技术搞扎实,说其他都都没有用;2.找到自己的用武之地,有自己的特点,有自己的能力才可以。3.坚持每天学习,每天总结,这是一生的好习惯【我是做不到】;4.考虑自己的年龄,找到自己年龄段该有的能力,该做的事情;…

    2022年6月24日
    24
  • 范冰:增长黑客入门训练营

    范冰:增长黑客入门训练营之前刚入门产品的时候,增长的概念已经很流行了,连着读了SeanEllis的《增长黑客:如何低成本实现爆发式成长》和范冰的《增长黑客:创业公司的用户与收入增长秘籍》以及相应的公开课,如果你不知道SeanEllis,那我觉得你应该认真花点时间去了解一下这位“增长黑客之父”了,之前已经分享过SeanEllis的公开课和关于这本书的读书笔记,比较开心的是无意中发现2019年《增长黑客:创业公司的用户与收入增长秘籍》的作者范冰就已经亲自开了这本增长黑客的课程,还是觉得好物不容错过!欢迎要资源,欢迎交流沟通过~

    2022年5月11日
    75
  • 这11款chrome神器,用起来爽到爆

    这11款chrome神器,用起来爽到爆前言对于从事IT行业的我们来说,几乎无时无刻都在用chrome浏览器,因为它给我们的工作和生活带来了极大的便利。今天给大家分享我用过的11款牛逼的chrome插件,你看完前3个可能就会忍不住想点赞了。1.谷歌翻译很多小伙伴,英语不太好,包括我自己,英语刚过四级。从事软件相关工作时,有时有些吃力,因为很多优秀的技术网站、书籍或者文章都是老外写的,如果因为看不懂就放弃阅读,我们将会少了很多学习和进步的机会。今天分享的第一个神器就是:谷歌翻译。在没使用谷歌翻译之前,访问https://doc

    2022年5月6日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号