CF 986A Fair——多源bfs
2024-10-21 15:56:09
题目: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 ;
}
最新文章
- linux 搜索相关命令(2)
- 基于BootStrap框架构建快速响应的GPS部标监控平台
- paper 124:【转载】无监督特征学习——Unsupervised feature learning and deep learning
- 关于工程结合git的配置
- miniui设置边框的方法
- 用Delphi获取当前系统时间
- (转) 通过input分片的大小来设置map的个数
- appium desktop 版本发布
- Jenkins+Ant+TestNG+Testlink自动化构建集成(完整版)
- 使用nginx作为websocket的proxy server
- Mysql 存储过程批量建表
- IIS配置支持跨域请求
- 关于shared_ptr与weak_ptr的使用(good)
- AutoPostBack
- linux的shadow文件
- html 巧用data-for藏自定义属性
- leetcode python 003
- HTML中的GroupBox
- HDU 2051 Bitset
- GetImageURL
热门文章
- 初识python---简介,简单的for,while&;if
- Python编程-数据库
- php数组函数-array_push()
- 20145231《Java程序设计》第四次实验报告
- Go 功能测试与性能测试
- Start and Use the Database Engine Tuning Advisor
- Python根据内嵌的数字将字符串排序(sort by numbers embedded in strings)
- java中,return和return null有什么区别吗?
- IOS 发布被拒 3.2 f
- Codeforces Round #373 (Div. 2) E. Sasha and Array 矩阵快速幂+线段树