[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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • h3c路由器配置命令_h3c路由器命令大全

    h3c路由器配置命令_h3c路由器命令大全en进入特权模式conf进入全局配置模式ins0进入serial0端口配置ipaddxxx.xxx.xxx.xxxxxx.xxx.xxx.xxx添加ip地址和掩码,电信分配encahdlc/ppp捆绑链路协议hdlc或者pppipunne0exit回到全局配置模式ine0进入以太接口配置ipaddxxx.xxx.xxx.xxxxxx.xxx.xxx…

    2022年10月18日
    1
  • VB.net视频打开方法

    VB.net视频打开方法VB.net视频打开方法

    2022年4月24日
    51
  • 初中英语语法(007)-比较级·最高级

    初中英语语法(007)-比较级·最高级比较级·最高级英语句子中,将比较两个主体的方法叫做“比较句型”。其中,像“A比B更……”的表达方式称为比较级。“A是所有人中最高的”,这种表达方式称为最高级,组成句子的方式是将形容词或副词变化成比较级或最高级的形态。“他比她更高”这句话里得“更”怎么表现呢?这需要形容词按照一定规则变化。1、变化规则(1)+er/est:short-shorter-shortest(2)原形以e…

    2022年7月16日
    34
  • Python if用法_无内嵌的if语句

    Python if用法_无内嵌的if语句本文的主要内容是介绍Python中if语句及其使用,包括条件测试、if-else语句、if-elif-else语句以及使用if语句处理列表操作,文中附有代码以及相应的运行结果辅助理解。

    2022年9月26日
    3
  • 在java中实现数据库连接的步骤(java数据库教程)

    JDBC的全称是JavaDataBaseConnectivity,是一套面向对象的连接数据库的程序接口。JDBC技术主要完成以下几个任务:1、与数据库建立一个连接。2、向数据库发送SQL语句。3、处理从数据库返回的结果。事实上,JDBC并不能直接访问数据库的,必须依赖于数据库厂商提供的驱动程序,所以会有加载驱动程序这一步。连接数据库的五大步骤:连接数据库就需要用到以下几个类和接口,…

    2022年4月14日
    105
  • 获取系统当前时间,绑定展示数据

    获取系统当前时间,绑定展示数据

    2021年9月30日
    39

发表回复

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

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