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. 网络1711-1712的C语言作业总结(2017-2018第一学期)

    1.第0次作业总结--预备作业 作业地址 1711班级总结 1712班级总结 2.第一次作业总结--顺序结构 作业地址 1711班级总结 1712班级总结 3.第二次作业总结--分支结构 作业地址 1 ...

  2. 1013团队alpha冲刺日志集合帖

    alpha冲刺day1 alpha冲刺day2 alpha冲刺day3 alpha冲刺day4 alpha冲刺day5 alpha冲刺day6 alpha冲刺day7 alpha冲刺day8 alph ...

  3. centos 安装配置 mysql

    安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo ...

  4. VS2013 重装 无法打开项目

    今天遇到的奇葩BUG,耗时我一下午,现在跟大家说道说道. 今天重装系统,让各种开发环境开发工具自然要重装一次,最后装完VS2013,然后刚好客户打电话要改点东西,然后我就双击项目准备打开改,然后奇葩来 ...

  5. 15-TypeScript策略模式

    在前面的简单工厂模式中,通常将每个类.接口定义到不同的文件中.在面向对象开发思想中有一个重要的原则就是封装变化点,在实际操作过程中, 通常被调用方的代码不要去更改,而是增加,这是面向对象的开闭原则.在 ...

  6. 利用java反射读写csv中的数据

      前一段有个需求需要将从数据库读取到的信息保存到csv文件中,在实现该需求的时候发现资料比较少,经过收集反射和csv相关资料,最终得到了如下程序.  1.在使用java反射读取csv文件数据时,先通 ...

  7. 数据结构与算法 —— 链表linked list(01)

    链表(维基百科) 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储, ...

  8. thinkphp框架调用类不存在的方法

    thinkphp框架调用类不存在的方法调用类不存在的方法,不会报错,但是也不会执行,这是根据tp框架里面的一个魔术方法,框架里面一共才十几个魔术方法

  9. 开源软件:NoSql数据库 - 图数据库 Cassandra

    转载原文:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra简介 在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了 ...

  10. 使用nodeJS的 crypto模块来为你的密码hash加盐

    这篇文章将向你解释如何使用Node.js的Crypto模块对你的密码进行加盐hash.在这里,我们将不会对不懂的密码存储方式进行详细的比较.我们将要做的是知道在Node.js中使用加盐hash在进行密 ...