博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Gym101170I:Iron and Coal(建多幅图+多次BFS)***
阅读量:4586 次
发布时间:2019-06-09

本文共 1850 字,大约阅读时间需要 6 分钟。

题意

有n个点,其中有m个点是铁矿,k个点是煤,从1号点出发,你可以派一些士兵跑向不同的点,问占领至少一个铁矿和一个煤的时候,最少需要占领多少个点。

思路

建两幅图,其中一幅是正向边,一幅是反向边。做三次BFS。

第一遍BFS:从1号点BFS一遍整个正向边的图,记录数组dis[0][i]为每个点距离1号点的距离。O(n)
第二遍BFS:从每个铁矿BFS一遍整个反向边的图,记录数组dis[1][i]为每个点距离每个铁矿的最近距离。O(n)
第三遍BFS:从每个煤BFS一遍整个反向边的图,和第二遍类似。
对于每个点,三个dis数组求和就是从一号点到最近的铁矿和最近的煤的距离和。

#include 
using namespace std;const int N = 1e5 + 10;const int INF = 0x3f3f3f3f;vector
g[2][N];int o[N], c[N], b[2] = {1, 1}, dis[3][N];void bfs(int e, int n, int p[], int id) { queue
que; while(!que.empty()) que.pop(); memset(dis[id], INF, sizeof(dis[id])); for(int i = 1; i <= n; i++) que.push(p[i]), dis[id][p[i]] = 0; while(!que.empty()) { int u = que.front(); que.pop(); for(int i = 0; i < g[e][u].size(); i++) { int v = g[e][u][i]; if(dis[id][v] != INF) continue; dis[id][v] = dis[id][u] + 1; que.push(v); } }}int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); for(int i = 1; i <= m; i++) scanf("%d", &o[i]); for(int i = 1; i <= k; i++) scanf("%d", &c[i]); for(int i = 0; i < 2; i++) for(int j = 1; j <= n; j++) g[i][j].clear(); for(int i = 1; i <= n; i++) { int a; scanf("%d", &a); for(int j = 1; j <= a; j++) { int v; scanf("%d", &v); g[0][i].push_back(v); g[1][v].push_back(i); } } bfs(0, 1, b, 0); bfs(1, m, o, 1); bfs(1, k, c, 2); int ans = INF; for(int i = 1; i <= n; i++) { // printf("%d : %d - %d - %d\n", i, dis[0][i], dis[1][i], dis[2][i]); if(dis[0][i] == INF || dis[1][i] == INF || dis[2][i] == INF) continue; ans = min(ans, dis[0][i] + dis[1][i] + dis[2][i]); } if(ans == INF) puts("impossible"); else printf("%d\n", ans); return 0;}

转载于:https://www.cnblogs.com/fightfordream/p/7215320.html

你可能感兴趣的文章
workspace 配置
查看>>
C# 针对特定的条件进行锁操作,不用lock,而是mutex
查看>>
Spring归纳
查看>>
MyEclipse Web Project导入Eclipse Dynamic Web Project,无法部署到tomcat问 题
查看>>
24小时学通Linux内核之向内核添加代码
查看>>
python 函数
查看>>
Solr4.0 如何配置使用UUID自动生成id值
查看>>
Marketing™Series用户手册(Marketing™Series Manual)
查看>>
Java动态代理
查看>>
二维码开源库zbar、zxing使用心得
查看>>
框架设计读书笔记--扩展点设计--组合法
查看>>
Web开发小贴士 -- 全面了解Cookie
查看>>
收藏Javascript中常用的55个经典技巧
查看>>
Arm-linux-gcc-4.3.2安装步骤
查看>>
Java多线程与并发编程学习
查看>>
Support Vector Machine
查看>>
牛客-2018多校算法第五场C-KMP
查看>>
Linux查看文件内容
查看>>
[转]社会生活中十二大著名法则 1 马太效应 2 手表定理 3 不值得定律 4 彼得原理 5 零和游戏原理 6 华盛顿合作规律 7 酒与污水定律 8 水桶定律 9 蘑菇管理 10 奥...
查看>>
浅谈三层与实体
查看>>