题目:http://codeforces.com/contest/986/problem/A

如果从每个村庄开始bfs找货物,会超时。

发现k较小。那就从货物开始bfs,给村庄赋上dis[ 该货物 ]。

但这样还是n^2。考虑有相同货物的村庄,其实可以一起bfs。就是多源bfs。这样就是n*k的了。

多源bfs就是把一些起始点的dis全赋了初值0,然后都放进队列里,之后正常bfs。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+,K=;
int n,m,k,s,head[N],xnt,dis[N][K],a[N],q[K][N],h,t[K];
struct Ed{
int next,to;
Ed(int n=,int t=):next(n),to(t) {}
}ed[N<<];
void add(int x,int y)
{
ed[++xnt]=Ed(head[x],y);head[x]=xnt;
ed[++xnt]=Ed(head[y],x);head[y]=xnt;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&s);
memset(dis,0x3f,sizeof dis);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);dis[i][a[i]]=;
q[a[i]][++t[a[i]]]=i;
}
int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);add(x,y);
}
for(int i=;i<=k;i++)
{
h=;
while(h<=t[i])
{
int k=q[i][h++];
for(int j=head[k],v;j;j=ed[j].next)
if(dis[v=ed[j].to][i]>dis[k][i]+)
{
dis[v][i]=dis[k][i]+;q[i][++t[i]]=v;
}
}
}
for(int i=;i<=n;i++)
{
int ans=;sort(dis[i]+,dis[i]+k+);
for(int j=;j<=s;j++)ans+=dis[i][j];
printf("%d ",ans);
}
return ;
}

最新文章

  1. linux 搜索相关命令(2)
  2. 基于BootStrap框架构建快速响应的GPS部标监控平台
  3. paper 124:【转载】无监督特征学习——Unsupervised feature learning and deep learning
  4. 关于工程结合git的配置
  5. miniui设置边框的方法
  6. 用Delphi获取当前系统时间
  7. (转) 通过input分片的大小来设置map的个数
  8. appium desktop 版本发布
  9. Jenkins+Ant+TestNG+Testlink自动化构建集成(完整版)
  10. 使用nginx作为websocket的proxy server
  11. Mysql 存储过程批量建表
  12. IIS配置支持跨域请求
  13. 关于shared_ptr与weak_ptr的使用(good)
  14. AutoPostBack
  15. linux的shadow文件
  16. html 巧用data-for藏自定义属性
  17. leetcode python 003
  18. HTML中的GroupBox
  19. HDU 2051 Bitset
  20. GetImageURL

热门文章

  1. 初识python---简介,简单的for,while&amp;if
  2. Python编程-数据库
  3. php数组函数-array_push()
  4. 20145231《Java程序设计》第四次实验报告
  5. Go 功能测试与性能测试
  6. Start and Use the Database Engine Tuning Advisor
  7. Python根据内嵌的数字将字符串排序(sort by numbers embedded in strings)
  8. java中,return和return null有什么区别吗?
  9. IOS 发布被拒 3.2 f
  10. Codeforces Round #373 (Div. 2) E. Sasha and Array 矩阵快速幂+线段树