Description

Air Bovinia operates flights connecting the N farms that the cows live on (1 <= N <= 20,000). As with any airline, K of these farms have been designated as hubs (1 <= K <= 200, K <= N).

Currently, Air Bovinia offers M one-way flights (1 <= M <= 20,000), where flight i travels from farm u_i to farm v_i and costs d_i (1 <= d_i <= 10,000) dollars. As with any other sensible airline, for each of these flights, at least one of u_i and v_i is a hub. There is at most one direct flight between two farms in any given direction, and no flight starts and ends at the same farm.

Bessie is in charge of running the ticketing services for Air Bovinia. Unfortunately, while she was away chewing on delicious hay for a few hours, Q one-way travel requests for the cows' holiday vacations were received (1 <= Q <= 50,000), where the ith request is from farm a_i to farm b_i.

As Bessie is overwhelmed with the task of processing these tickets, please help her compute whether each ticket request can be fullfilled, and its minimum cost if it can be done.

To reduce the output size, you should only output the total number of ticket requests that are possible, and the minimum total cost for them. Note that this number might not fit into a 32-bit integer.

是n个点m条有向边,求两两之间的最短路,要求路径上必须经过编号1~k的至少一个点

Input

  • Line 1: The integers N, M, K, and Q.

  • Lines 2..M + 1: Line i+1 contains u_i, v_i, and d_i. (1 <= u_i, v_i <= N, u_i != v_i)

  • Lines M + 2..M + K + 1: Each of these lines contains the ID of a single hub (in the range 1..N).

  • Lines M + K + 2..M + K + Q + 1: Two numbers per line, indicating a request for a ticket from farm a_i to b_i. (1 <= a_i, b_i <= N, a_i != b_i)

Output

  • Line 1: The number of ticket requests that can be fullfilled.

  • Line 2: The minimum total cost of fulling the possible ticket requests

Sample Input

3 3 1 2
1 2 10
2 3 10
2 1 5
2
1 3
3 1

Sample Output

1
20

Hint

For the first flight, the only feasible route is 1->2->3, costing 20. There are no flights leaving farm 3, so the poor cows are stranded there.

题解

显然是一道求多源最短路的题,而总的点数远远超过了$floyd$的承受范围。

我们用分治的思想,注意到题中所有边都是与“关键点”即收费站相连的,显然我们可以考虑对于这些点进行$floyd$。

对于非关键点的点,我们可以枚举,并在之前$floyd$处理完的“块”内求一遍单源最短路,注意与枚举的点相连的边是“出边”还是“入边”。

处理答案时,注意点要分是在“块”内还是“块”外。

 #include<cmath>
#include<queue>
#include<ctime>
#include<stack>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int N=;
int INF; struct tt
{
int to,next,cost;
}edge[N+];
int path[N+],top;
int n,m,k,q,u,v,d;
int x[],num[N+];
int map[][];
int in[N+][],out[][N+]; void Count_in();
void Count_out();
void Floyd();
void Build();
inline void Add(int x,int y,int c);
inline int my_min(int x,int y);
inline int Read(); int main()
{
n=Read();m=Read();k=Read();q=Read();
for (int i=;i<=m;i++)
{
u=Read();v=Read();d=Read();
Add(u,v,d);
}
for (int i=;i<=k;i++)
{
x[i]=Read();
num[x[i]]=i;
}
Floyd();
Count_in();
Count_out();
int cnt=,sum=,ans=*INF,x,y;
for (int i=;i<=q;i++)
{
x=Read();y=Read();
if (num[x]&&num[y]) {if (map[num[x]][num[y]]<INF) cnt++,sum+=map[num[x]][num[y]];}
else if (num[x]) {if (out[num[x]][y]<INF) cnt++,sum+=out[num[x]][y];}
else if (num[y]) {if (in[x][num[y]]<INF) cnt++,sum+=in[x][num[y]];}
else
{
int ans=*INF;
for (int j=;j<=k;j++) if (in[x][j]+out[j][y]<ans) ans=in[x][j]+out[j][y];
if (ans<INF) cnt++,sum+=ans;
}
}
printf("%d\n%d\n",cnt,sum);
return ;
} inline void Add(int x,int y,int c)
{
edge[++top].to=y;
edge[top].cost=c;
edge[top].next=path[x];
path[x]=top;
}
void Floyd()
{
memset(map,/,sizeof(map));
Build();
for (int p=;p<=k;p++)
for (int i=;i<=k;i++)
for (int j=;j<=k;j++)
if (map[i][j]>map[i][p]+map[p][j])
map[i][j]=map[i][p]+map[p][j];
}
void Build()
{
for (int i=;i<=k;i++)
for (int j=path[x[i]];j;j=edge[j].next)
if (!num[edge[j].to])
for (int p=path[edge[j].to];p;p=edge[p].next)
map[i][num[edge[p].to]]=my_min(map[i][num[edge[p].to]],edge[j].cost+edge[p].cost);
else map[i][num[edge[j].to]]=my_min(map[i][num[edge[j].to]],edge[j].cost);
}
void Count_in()
{
memset(in,/,sizeof(in));INF=in[][];
for (int i=;i<=n;i++) if (!num[i])
{
for (int j=path[i];j;j=edge[j].next)
{
if (in[i][num[edge[j].to]]>edge[j].cost)
in[i][num[edge[j].to]]=edge[j].cost;
for (int p=;p<=k;p++) if (in[i][p]>map[num[edge[j].to]][p]+edge[j].cost)
in[i][p]=map[num[edge[j].to]][p]+edge[j].cost;
}
}
}
void Count_out()
{
memset(out,/,sizeof(out));
for (int i=;i<=k;i++)
{
for (int j=path[x[i]];j;j=edge[j].next) if (!num[edge[j].to])
{
if (out[i][edge[j].to]>edge[j].cost)
out[i][edge[j].to]=edge[j].cost;
for (int p=;p<=k;p++) if (out[p][edge[j].to]>map[p][i]+edge[j].cost)
out[p][edge[j].to]=map[p][i]+edge[j].cost;
}
}
}
inline int my_min(int x,int y) {return x<y ? x:y;}
inline int Read()
{
int sum=;
char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='')
{
sum=sum*+ch-'';
ch=getchar();
}
return sum;
}

[USACO 13DEC]Vacation Planning(gold)的更多相关文章

  1. [USACO13DEC]假期计划(黄金)Vacation Planning (gold)

    题目翻译不好,这里给出一份 题目背景 Awson是某国际学校信竞组的一只大佬.由于他太大佬了,于是干脆放弃了考前最后的集训,开车(他可是老司机)去度假.离开学校前,他打开地图,打算做些规划. 题目描述 ...

  2. bzoj 4097: [Usaco2013 dec]Vacation Planning

    4097: [Usaco2013 dec]Vacation Planning Description Air Bovinia is planning to connect the N farms (1 ...

  3. USACO 2015 December Contest, Gold Problem 2. Fruit Feast

    Problem 2. Fruit Feast 很简单的智商题(因为碰巧脑出来了所以简单一,一 原题: Bessie has broken into Farmer John's house again! ...

  4. bzoj4097 [Usaco2013 dec]Vacation Planning

    Description Air Bovinia is planning to connect the N farms (1 <= N <= 200) that the cows live ...

  5. 【Floyd(并非水题orz)】BZOJ4093-[Usaco2013 Dec]Vacation Planning

    最近刷水太多标注一下防止它淹没在silver的水题中……我成为了本题,第一个T掉的人QAQ [题目大意] Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班. ...

  6. USACO 2016 February Contest, Gold解题报告

    1.Circular Barn   http://www.usaco.org/index.php?page=viewproblem2&cpid=621 贪心 #include <cstd ...

  7. USACO 2016 January Contest, Gold解题报告

    1.Angry Cows http://www.usaco.org/index.php?page=viewproblem2&cpid=597 dp题+vector数组运用 将从左向右与从右向左 ...

  8. USACO 2013 November Contest Gold 简要题解

    Problem 1. Empty Stalls 扫两遍即可. Problem 2. Line of Sight 我们发现能互相看见的一对点一定能同时看见粮仓的某一段.于是转换成有n段线段,问有多少对线 ...

  9. 洛谷P3094 [USACO13DEC]假期计划Vacation Planning

    题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100 ...

随机推荐

  1. IntelliJIDEA中如何使用JavaDoc

    IntelliJ IDEA 12.1.6,本身提供了很好的 JavaDoc 生成功能,以及标准 JavaDoc 注释转换功能,其实质是在代码编写过程中,按照标准 JavaDoc 的注释要求,为需要暴露 ...

  2. 巨人大哥谈Java中的Synchronized关键字用法

    巨人大哥谈Java中的Synchronized关键字用法 认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就 ...

  3. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.14

    第一次会议:2017-11-14 额--这几天比较忙,忘记上传了,今天补上 先上个图,O(∩_∩)O哈哈: 会议主要内容: 1. 讨论整体框架 2. 个人具体分工 3. 代码统一 具体分工: 成员 计 ...

  4. 【iOS】Swift LAZY 修饰符和 LAZY 方法

    延时加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,这个时间更是不可忽略.另外,有些情况下我们并不会立即用到 ...

  5. c# 运算符:? ,??

    参考微软帮助 1  ?  空值条件运算符,用于在执行成员访问 (?.) 或索引 (?[) 操作之前,测试是否存在 NULL. // ? 空值条件运算符 string str = null; Conso ...

  6. 集合Collection总览

    前言 声明,本文使用的是JDK1.8 从今天开始正式去学习Java基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...

  7. css3动画 一行字鼠标触发 hover 从左到右颜色渐变

    偶然的机会发现的这个东东 这几天做公司的官网 老板突然说出了一个外国网站 我就顺手搜了 并没有发现他说的高科技 但是一个东西深深地吸引了我 就是我下面要说的动画  这个好像不能放视频 我就简单的描述一 ...

  8. 教你在不使用框架的情况下也能写出现代化 PHP 代码

    我为你们准备了一个富有挑战性的事情.接下来你们将以 无 框架的方式开启一个项目之旅. 首先声明, 这篇并非又臭又长的反框架裹脚布文章.也不是推销 非原创 思想 .毕竟, 我们还将在接下来的开发之旅中使 ...

  9. 11-TypeScript中的名称空间

    在后端开发语言中,比如C#中,可以将不同源代码文件中的代码通过名称空间组合到一起.一般一个类定义在一个源代码文件中,在功能上属于一个上下文的源代码文件通过名称空间进行组织. 在TypeScript中, ...

  10. Mongodb中 Documents文档说明

    mongodb使用BSON格式存储数据记录. 如下图: 文档结构 文档有键值对组成, 有以下结构: {    field1: value1,    field2: value2,    ...     ...