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


相关推荐

  • java环境变量完美配置教程

    java环境变量完美配置教程java环境变量配置教程首先,下载JDK开发包,官网和我的主页资源库都有,建议下载比较稳定普遍的1.8版本,安装时注意安装路径,安装完成后按路径找到相关文件,你会看到JDK1.8的文件夹,看见bin再点一次,然后点击正上方很长的那个输出栏,会出来一串路径复制他. 然后我们到了桌面找到我的电脑,如果没有我的电脑,自己在设置个性化中找桌面图标显示。还有某些系统是快捷方式,(右击,看到属性点击,打开文件所在位置即可)然后要是啥问题没有,咱们就右击,看见属性点击,你会看见高级系统设置点他,看没看见环境变

    2022年6月18日
    25
  • UML时序图绘制

    UML时序图绘制参考 UML 时序图 SequenceDiag 学习笔记 SuperMan zhang 的博客 CSDN 博客 uml 时序图

    2025年12月12日
    13
  • PowerBuilder — 条码打印

    PowerBuilder — 条码打印#使用ocx控件使用微软的MSBCODE9.OCX,但是注册老不成功,需要安装office之后才能注册成功,不知道有没有好的处理方法??#使用字体字体下载:http://download.csdn.net/detail/easyboot/9452777字符转换:代码来源http://club.excelhome.net/thread-606919-1-1.html…

    2022年7月26日
    15
  • Day5- php 特殊类型 资源 NULL

    Day5- php 特殊类型 资源 NULL

    2021年9月15日
    54
  • xShell连接vmware虚拟机【经典】[通俗易懂]

    在刚刚开始学习Linux的同学,在VMware安装好Linux之后,不知道怎么去设置Ip,通过xshell去和虚拟机进行连接,下面就是我自己学习时候总结的连接方法,希望大家在连接后好好学习,我们一起进步。我的配置环境是VMware8,安装的是centOS6.3,使用的是Xshell5.l在虚拟机安装好Linux如图:1:输入 setup 回车,看到下面的界面,选择Network …

    2022年3月1日
    1.1K
  • 解决 canvas 在高清屏中绘制模糊的问题

    解决 canvas 在高清屏中绘制模糊的问题

    2021年6月5日
    98

发表回复

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

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