多源bfs

https://codeforces.com/contest/1283/problem/D

题意:在一条无限长的坐标轴上,给你n颗树,m个人。求所有人到树的最短距离的总和和坐标。

解法:多源bfs,map标记。

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF  0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
using namespace std;
typedef long long ll ;
map<int , int>ma;

struct node{
    int x , st ;
    node(int x , int st):x(x),st(st){}
};

int main()
{
    queue<node>q;
    int n , m ;
    scanf("%d%d" , &n , &m);
    for(int i = 0 ; i < n ; i++)
    {
        int x ;
        scanf("%d" , &x);
        q.push(node(x , 0));
        ma[x] = 1;
    }
    int ans = 0 ;
    ll sum = 0 ;
    vector<int>v;
    while(!q.empty())
    {
        node a = q.front();
        q.pop();
        if(ma[a.x + 1] != 1)
        {
            ans++;
            q.push(node(a.x + 1 , a.st+1));
            sum += a.st + 1 ;
            v.push_back(a.x + 1);
            ma[a.x+1] = 1 ;
        }
        if(ans == m) break ;
        if(ma[a.x - 1] != 1)
        {
            ans++;
            q.push(node(a.x - 1 , a.st+1));
            sum += a.st + 1 ;
            v.push_back(a.x - 1);
            ma[a.x-1] = 1 ;
        }
        if(ans == m) break ;
    }
    cout << sum << endl ;
    for(auto i : v)
    {
        cout << i << " " ;
    }
    cout << endl ;

    return 0 ;
}

原文地址:https://www.cnblogs.com/nonames/p/12237908.html

时间: 2024-10-08 11:00:13

多源bfs的相关文章

CF 986A Fair——多源bfs

题目:http://codeforces.com/contest/986/problem/A 此题乍一看没什么不T的思路... 发现边权是1,bfs? 考虑朴素的想法,遍历所有的点,bfs,过程中更新出各种商品的最短路,然后排序加和-- 好像很不行,似乎有一大堆冗余的东西,主要因为每个点上只有一种商品啊: 不妨干脆换个思路,不是找每个点到每种商品的距离,而是找每种商品到每个点的距离,如何? 一种商品存在于多个点上,可以进行多源 bfs! 也就是 bfs 一开始的时候把多个点加进优先队列里,复杂度

bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252 又没能自己想出来... 一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不走了... 然而实际上直接多源bfs,从所有1一起开始,因为只需要找到0碰到的第一个1即可: 这样搜一遍就可以,复杂度很美. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<al

F. Super Jaber (多源BFS)

题目:传送门 题意: 有n * m个城市,每个城市都有一个颜色,共有 k 种颜色,也就是每个城市的颜色只能是 1 ~ k 的某个数字.      然后,有q次询问,每次询问给你 x1, y1, x2, y2:问你从(x1, y1)到(x2, y2)的最少操作数.      操作有两种: 1. 你可以移动到你当前位置的上下左右,只要不越界.       2.你可以移动到任意和你当前所在的位置颜色相同的位置. 1 <= n, m <= 1000,  k <= min(40, n * m):

uva 11624 Fire!(多源BFS)

uva 11624 Fire! 题目大意:J在迷宫里工作,有一天迷宫起火了,火源有多处.每过一秒,火源都会向四个方向蔓延,J也会向四个方向移动,问J能不能跑出去,能的话输出他跑出去的最短时间,否则输出"IMPOSSIBLE" 解题思路:先进行一次BFS,找出每一点火焰蔓延到该处的最短时间.然后根据这张"火势图",对J的行进路线进行BFS.注意J在边缘的时候,以及没有火源的时候. #include <cstdio> #include <cstring

Codeforces Round #533 (Div. 2) D. Kilani and the Game(BFS)

题目链接:https://codeforces.com/contest/1105/problem/D 题意:p 个人在 n * m 的地图上扩展自己的城堡范围,每次最多走 a_i 步(曼哈顿距离),按 1 ~ p 的顺序,问最后每个人占领的点的数量. 题解:用一个队列维护当前起点,用另一个队列模拟当前起点走 a_i 步可以到达的全部点.(60 ~ 63行关键代码,多源bfs,不可分开跑) 数据: 4 3 2 2 1 1.. 1.. ..2 ... output:10 2 1 #include <

图论算法与模型(训练指南题库)

一.基础题目 1.UVA 11624 Fire!迷宫问题 多源BFS 题意: 帮助joe走出一个大火蔓延的迷宫,其中joe每分钟可往上下左右四个方向之一走,所有着火的格子都会蔓延(空格与着火格有公共边,下一分钟这个空格也会着火).迷宫中有一些障碍格,joe和火都无法进入,当joe走到一个边界的格子我们认为他走出了迷宫 输出R行C列的迷宫,#表示墙,.表示空地,J表示joe,F是着火格 如果能走出,输出最少时间否则,impossible 思路: 先预处理出每个点的起火时间,可以用多源点BFS直接处

CF 987 D. Fair

D. Fair http://codeforces.com/contest/987/problem/D 题意: n个城镇m条道路,(保证没有重边,两个城镇间可以到达),每个城镇拥有的特产ai(可能多个城镇有相同特产).总共有k种不同特产.每个城镇举办展会需要至少s种特产,一份特产从一个城镇运到另一个城镇的花费为最短路(每次只能运一个).求出在每个城镇举办展会的最小花费. 分析: bfs. 如果直接枚举每个城镇作为举办展会,然后计算到每个特产的最短路,取出前s个,复杂度n^2. 发现k<=100,

Codeforces Round #485 Div. 1 vp记

A:对每种商品多源bfs一下每个点到该商品的最近距离,对每个点sort一下取前s个即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define int long long #d

CF1105D Kilani and the Game

思路: 模拟多源bfs. 实现: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef pair<int, int> pii; 4 char a[1005][1005]; 5 const int dx[4] = {1, 0, -1, 0}; 6 const int dy[4] = {0, 1, 0, -1}; 7 int s[10], ans[10], l[10], d[1005][1005]; 8 inline b