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

于是预处理每个点离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;
}

【枚举】【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. 【二分】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem C. Careful Ascent

    二分Vx即可. #include<cstdio> #include<algorithm> using namespace std; #define EPS 0.00000000 ...

  3. 【强连通分量缩点】【DFS】【动态规划】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem B. British Menu

    有向图,不经过重复点的最长链,强连通分量大小不超过5. 每个强连通分量内部暴力预处理任意两对点之间的最长路,外面DAG上dp. 不是很好写,但是预处理完了之后,可以重构每个强连通分量内部的结构,然后整 ...

  4. 【枚举】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem G. Equation

    f(n)定义为n的十进制表示下所有位的平方和. 问你方程K*f(n)=n在a<=n<=b中的解的个数. 发现f(n)最大不超过2000,可以直接枚举f(n),然后判断K*f(n)的位的平方 ...

  5. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  6. Petrozavodsk Summer Training Camp 2017 Day 9

    Petrozavodsk Summer Training Camp 2017 Day 9 Problem A. Building 题目描述:给出一棵树,在树上取出一条简单路径,使得该路径的最长上升子序 ...

  7. Petrozavodsk Summer Training Camp 2017

    Petrozavodsk Summer Training Camp 2017 Problem A. Connectivity 题目描述:有\(n\)个点,现不断地加边.每条边有一种颜色,如果一个点对\ ...

  8. Petrozavodsk Winter Training Camp 2018

    Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸 ...

  9. 2017 湖南省赛 K Football Training Camp

    2017 湖南省赛 K Football Training Camp 题意: 在一次足球联合训练中一共有\(n\)支队伍相互进行了若干场比赛. 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为 ...

随机推荐

  1. nsa工程式(fb.py): perl6调用并修改IP

    use v6; if (@*ARGS != 1) {say 'Use:scan.p6 ip';exit;} my $check_ip = @*ARGS[0]; $check_ip = '<val ...

  2. perl HTML::HeadParser获取html头部信息

    use LWP::Simple; use HTML::HeadParser; use utf8; binmode(STDOUT, ":encoding(gbk)"); #设置win ...

  3. python面向对象进阶(下)

    一.item系列:就是把字典模拟成一个字典去操作(操作字典就用item的方式) obj[‘属性’]的方式去操作属性时触发的方法 __getitem__:obj['属性'] 时触发 __setitem_ ...

  4. 关于IE8版本提示“不支持‘trim’此属性或者方法”的解决办法。转摘雨网络

    在js文件的前面加 String.prototype.trim = function () { return Trim(this); }; function LTrim(str) { var i; f ...

  5. PHP获取ip与ip所在城市

    1获取真实ip,本地测试总是::1 或者127.0.0.1 或者局域网的ip /** * 获取用户真实 IP */ function getIP() { static $realip; if (iss ...

  6. leetcode之Ransom Note

    题目描述: 
Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 a ...

  7. IntelliJ IDEA 启动方法

    IntelliJ IDEA cd idea-IU-145.1617.8/bin && ./idea.sh

  8. 微信小程序实战篇-下拉刷新与加载更多

    下拉刷新 实现下拉刷新目前能想到的有两种方式 1. 调用系统的API,系统有提供下拉刷新的API接口 2. 监听scroll-view,自定义下拉刷新,还记得scroll-view里面有一个binds ...

  9. Search for a Range——稍微升级版的二分查找

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  10. h5游戏制作

    前言: 好久没更新博客了,以前很多都不会,所以常常写博客总结,倒是现在有点点经验了就懒了.在过去的几个月里,在canvas游戏框架方面,撸过了CreateJS,玩得了Egret,又学过PIXI.js. ...