那个人派出的队伍的行走的路径一定前半程是重合的,后半程分叉开来。

于是预处理每个点离1号点的最短路,到最近的铁的最短路,到最近的煤的最短路。(三次BFS / SPFA)然后枚举分岔点,尝试更新答案即可。

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
queue<int>q;
int v[1000010],first[100010],next[1000010],en;
ll ans=2147483647ll;
void AddEdge(int U,int V){v[++en]=V;next[en]=first[U];first[U]=en;
}
int n,m,K,a[100010],b[100010],dis1[100010],dis2[100010],dis3[100010],eu[1000010],ev[1000010],es;
bool inq[100010];
void spfa1(int dis[])
{memset(dis,0x7f,sizeof(int)*100010);memset(inq,0,sizeof(inq));for(int i=1;i<=m;++i){dis[a[i]]=0;q.push(a[i]);inq[a[i]]=1;}while(!q.empty()){int U=q.front();for(int i=first[U];i;i=next[i])if(dis[v[i]]>dis[U]+1){dis[v[i]]=dis[U]+1;if(!inq[v[i]]){q.push(v[i]);inq[v[i]]=1;}}q.pop(); inq[U]=0;}
}
void spfa2(int dis[])
{memset(dis,0x7f,sizeof(int)*100010);memset(inq,0,sizeof(inq));for(int i=1;i<=K;++i){dis[b[i]]=0;q.push(b[i]);inq[b[i]]=1;}while(!q.empty()){int U=q.front();for(int i=first[U];i;i=next[i])if(dis[v[i]]>dis[U]+1){dis[v[i]]=dis[U]+1;if(!inq[v[i]]){q.push(v[i]);inq[v[i]]=1;}}q.pop(); inq[U]=0;}
}
void spfa3(int dis[]){memset(dis,0x7f,sizeof(int)*100010);memset(inq,0,sizeof(inq));dis[1]=0; q.push(1); inq[1]=1;while(!q.empty()){int U=q.front();for(int i=first[U];i;i=next[i])if(dis[v[i]]>dis[U]+1){dis[v[i]]=dis[U]+1;if(!inq[v[i]]){q.push(v[i]);inq[v[i]]=1;}}q.pop(); inq[U]=0;}
}
int main(){
//  freopen("i.in","r",stdin);scanf("%d%d%d",&n,&m,&K);for(int i=1;i<=m;++i){scanf("%d",&a[i]);}for(int i=1;i<=K;++i){scanf("%d",&b[i]);}int x,y;for(int i=1;i<=n;++i){scanf("%d",&x);for(int j=1;j<=x;++j){scanf("%d",&y);AddEdge(y,i);eu[++es]=i;ev[es]=y;}}spfa1(dis1);spfa2(dis2);memset(first,0,sizeof(first));memset(next,0,sizeof(next));memset(v,0,sizeof(v));en=0;for(int i=1;i<=es;++i){AddEdge(eu[i],ev[i]);}spfa3(dis3);for(int i=1;i<=n;++i){ans=min(ans,(ll)dis3[i]+(ll)dis1[i]+(ll)dis2[i]);}if(ans<=2000000000ll){printf("%d\n",(int)ans);}else{puts("impossible");}return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/7198397.html

【枚举】【SPFA】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem I. Iron and Coal相关推荐

  1. 【计算几何】【预处理】【枚举】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees...

    发现由于角的度数和边的长度有限制,那俩圆如果放得下的话,必然是塞在两个角里. 于是预处理n个圆心的位置(注意要判断那个圆会不会和其他的边界相交),然后n^2枚举俩角即可. #include<cs ...

  2. Codeforces Round #588 (Div. 2) D. Marcin and Training Camp 思维

    传送门 文章目录 题意: 思路: 题意: 有nnn个人,每个人都有一个能力值bib_ibi​以及他会的技能aia_iai​,当他会第xxx个技能的时候,aia_iai​的第xxx位是111.定义当xx ...

  3. U3D笔记11:47 2016/11/30-15:15 2016/12/19

    U3D笔记11:47 2016/11/30-15:15 2016/12/19 技术BLOG:http://www.unity.5helpyou.com/2373.html#comment-43108 ...

  4. Windows Server 2016及System Center 2016正式商用

    Windows Server 2016  及 System Center 2016 现已正式商用.作为微软全新一代的服务器操作系统和数据中心管理平台,它们将为企业 IT 带来全面的性能与安全性提升:为 ...

  5. 翻译 Windows Server 2016和System Center 2016 技术预览版4 使创新更容易

    英文标题:Make innovation easier with Windows Server 2016 and System Center 2016 Technical 中文标题:Windows S ...

  6. 清华大学计算机系2016名单,关于电子系2016 级、2017 级本科生分流至微纳电子系学生名单公示...

    关于电子系2016 级.2017 级本科生分流至微纳电子系学生名单公示 经电子系2016 级.2017 级学生本人申报专业志愿.教务处审批,拟定26 名同学从电子系分流至微纳电子系,现予以公示. 学号 ...

  7. [2016湘潭邀请赛 A. 2016] 大数取模+循环节

    [2016湘潭邀请赛 A. 2016] 大数取模+循环节 1. 题目链接 XTU OnlineJudge : [2016湘潭邀请赛 A. 2016] 2. 题意描述 [图片看不清可以放大.] 给定一个 ...

  8. Visio 2016 MSI 与 Office 2016 Click-to-Run 冲突导致无法安装的解决方法

    Visio 2016 MSI 与 Office 2016 Click-to-Run 冲突导致无法安装的解决方法 问题描述 已安装:Office 2016 家庭与学生版 64 bit(Click-to- ...

  9. Summer Online Training Camp 1 for ICPC Training League (Recursion Backtracking)

    ICPC训练联盟暑期线上集训(递归与回溯) A POJ 1664 放苹果 题解 B POJ 2013 Symmetric Order 题解 C POJ 3889 Fractal Streets D P ...

最新文章

  1. Windows下安装配置SBT
  2. 【Android工具】远程登录会话工具免费好用的SSH客户端——JuiceSSH
  3. 十二、dbms_logmnr(分析重做日志和归档日志)
  4. 运行银联支付系统demo
  5. 十一.激光惯导LIO-SLAM框架学习之LIO-SAM框架---框架介绍和运行演示
  6. php js后端渲染,webpack后端渲染详解
  7. TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
  8. 【排错】exchange2013不能显示所有OU
  9. SQL Server数据行的物理空间分配
  10. 嵌入式Linux学习笔记
  11. inno setup制作的安装包,安装后以管理员身份启动
  12. Sun Dec 31 19:00:00 CST 1899格式的字符串转Date
  13. 重学计算机组成原理(一) —— 冯诺伊曼结构
  14. 使用U盘制作Ubuntu21.10、Windows10多个系统的启动盘
  15. 使用博图V15和KEPServerEX6软件进行OPC Server读取PLC数据仿真(对PLC数据采集和边缘计算程序测试的准备)
  16. php phalcon 安装,Phalcon框架安装与使用教程介绍
  17. 2021研报目录更新
  18. 【UML】用例图、活动图、类图、顺序图练习题
  19. rabbitmq的启停与异常
  20. FPGA的BRAM和distributed RAM学习

热门文章

  1. Citrx XenDesktop 7 实施三 配置XenServer
  2. 23种设计模式MM版形象描述
  3. 【C语言】简单C编程题-同位相同的N项之和/标准输入花括号成对判断/行号行输出...
  4. #Sora#OpenStack基础库oslo.config试用总结
  5. makefile讲义(1)——makefile基础(概述)
  6. 为什么说,长跑和爬山能锻炼意志?因为要不停的run,run,run......
  7. 【C】浅谈strcpy
  8. WPF 回车转Tab实现跳转
  9. DotNetSpeech.dll的使用
  10. linux 学习过程中的坑之 find 正则表达式