[USACO 13DEC]Vacation Planning(gold)
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)的更多相关文章
- [USACO13DEC]假期计划(黄金)Vacation Planning (gold)
题目翻译不好,这里给出一份 题目背景 Awson是某国际学校信竞组的一只大佬.由于他太大佬了,于是干脆放弃了考前最后的集训,开车(他可是老司机)去度假.离开学校前,他打开地图,打算做些规划. 题目描述 ...
- bzoj 4097: [Usaco2013 dec]Vacation Planning
4097: [Usaco2013 dec]Vacation Planning Description Air Bovinia is planning to connect the N farms (1 ...
- USACO 2015 December Contest, Gold Problem 2. Fruit Feast
Problem 2. Fruit Feast 很简单的智商题(因为碰巧脑出来了所以简单一,一 原题: Bessie has broken into Farmer John's house again! ...
- bzoj4097 [Usaco2013 dec]Vacation Planning
Description Air Bovinia is planning to connect the N farms (1 <= N <= 200) that the cows live ...
- 【Floyd(并非水题orz)】BZOJ4093-[Usaco2013 Dec]Vacation Planning
最近刷水太多标注一下防止它淹没在silver的水题中……我成为了本题,第一个T掉的人QAQ [题目大意] Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班. ...
- USACO 2016 February Contest, Gold解题报告
1.Circular Barn http://www.usaco.org/index.php?page=viewproblem2&cpid=621 贪心 #include <cstd ...
- USACO 2016 January Contest, Gold解题报告
1.Angry Cows http://www.usaco.org/index.php?page=viewproblem2&cpid=597 dp题+vector数组运用 将从左向右与从右向左 ...
- USACO 2013 November Contest Gold 简要题解
Problem 1. Empty Stalls 扫两遍即可. Problem 2. Line of Sight 我们发现能互相看见的一对点一定能同时看见粮仓的某一段.于是转换成有n段线段,问有多少对线 ...
- 洛谷P3094 [USACO13DEC]假期计划Vacation Planning
题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100 ...
随机推荐
- C语言-第一次作业
题目6-1 计算两数的和与差 1.设计思路 (1)主要描述题目算法 第一步:看主函数知道程序输入浮点型变量a,b,通过函数计算输出和与差. 第二步:函数部分将a赋值op1,b赋值op2,&su ...
- C语言——第七周作业
题目 题目一:求交错序列前N项和 1.实验代码 #include <stdio.h> int main() { int n , i , b ; , a , c ; scanf(" ...
- 服务器磁盘阵列数据恢复,raid5两块硬盘掉线数据恢复方法
[用户单位信息] 农业科学研究院某研究所 [磁盘阵列故障发生过程描述]客户的DELL MD1000服务器内置15块1TB硬盘搭建为RAID5磁盘阵列阵列,服务器在正常工作中有一块硬盘离线,管理员对磁盘 ...
- java中DelayQueue的一个使用陷阱分析
最近工作中有接触到DelayQueue,网上搜索资料的时候发现一篇文章谈到DelayQueue的坑.点击打开链接 文中已经总结了遇到坑的地方,还有解决方案.不过我第一眼看一下没弄明白为什么,所以翻了翻 ...
- Mybatis学习日志
在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...
- Ubuntu16.04 + Zabbix 3.4.7 邮件报警设置
部署了Zabbix,需要配置邮件报警,在网上找了一些教程,大多是是用的CentOS + Zabbix 2.x版本的,而且还要写脚本,感觉太麻烦了,所以自己结合其他文章摸索了一套配置方法. 先说一下环境 ...
- python 判断变量是否是 None 的三种写法
代码中经常会有变量是否为None的判断,有三种主要的写法:第一种是`if x is None`:第二种是 `if not x:`:第三种是`if not x is None`(这句这样理解更清晰`if ...
- python常用运算符
1. / 浮点除法,就算分子分母都是int类型,也返回float类型,比如我们用4/2,返回2.0 2. // 整数除法,根据分子分母的不同组合,返回的值有差异. 正数//正数,取整,比如5//3,返 ...
- Asp.NET Core2.0 项目实战入门视频课程_完整版
END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...
- 初识JavaScript闭包
一个问题引发的思考 在我学习javascript的事件时,有一个小任务是使用JS来实现 li 列表项在鼠标悬浮时会有背景阴影的动态效果,很自然想到用for 来为每个列表项添加onmouseover 和 ...