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. 在Winform混合式框架中整合外部API接口的调用

    在我们常规的业务处理中,一般内部处理的接口多数都是以数据库相关的,基于混合式开发的Winform开发框架,虽然在客户端调用的时候,一般选择也是基于Web API的调用,不过后端我们可能不仅仅是针对我们 ...

  2. 极光征文 | 写写文章就能赢 Filco,岂不美滋滋

    由极光社区举办的第二届征文大赛 --「我和极光的那些事儿」又来啦! 在简书平台发布文章并投稿至「我和极光的那些事」专题,只要参与就能 100% 获得京东购物卡,更有机会赢取象征信仰的 Filco 机械 ...

  3. HIVE的常用操作(HQL)语句

    HIVE基本操作命令 创建数据库 >create database db_name; >create database if not exists db_name;//创建一个不存在的数据 ...

  4. 使用jmeter+ant进行接口自动化测试(数据驱动)之一:设计jmeter脚本

    最近在做接口测试,因为公司有使用jmeter做接口测试的相关培训资料,所以还是先选择使用jmeter来批量管理接口,进行自动化测试.话不多说,进入正题: 1.使用csv文件保存接口测试用例,方便后期对 ...

  5. 网络1712--c语言字符数组作业总结..

    ---恢复内容开始--- 作业亮点 1.总体情况 1.大部分同学利用了流程图后,对于思路的理解有了提升. 2.很多同学在总结方面写的很不错,能够罗列问题贴出解决问题,我们能够看到你们的进步 2.作业发 ...

  6. 201621123057 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...

  7. 详谈C++虚函数表那回事(多重继承关系)

    上一篇说了一般继承,也就是单继承的虚函数表,接下来说说多重继承的虚函数表: 1.无虚函数覆盖的多重继承: 代码: #pragma once //无覆盖,多重继承 class Base1 { publi ...

  8. JAVA_SE基础——40.super关键字

    只要this关键字掌握了,super关键字不在话下,因为他们原理都差不多的.. this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针 ...

  9. JAVA_SE基础——15.循环嵌套

    嵌套循环是指在一个循环语句的循环体中再定义一个循环语句结构,while,do-while,for循环语句都可以进行嵌套,并且可以互相嵌套,下面来看下for循环中嵌套for循环的例子. 如下: publ ...

  10. 安装 docker-compose

    安装Docker-Compose之前,请先安装 python-pip,安装好pip之后,就可以安装Docker-Compose了. 一.检查是否已经安装 二.安装 docker-compose 1.安 ...