[USACO13DEC]假期计划(黄金)Vacation Planning (gold)
题目翻译不好,这里给出一份
题目背景
Awson是某国际学校信竞组的一只大佬。由于他太大佬了,于是干脆放弃了考前最后的集训,开车(他可是老司机)去度假。离开学校前,他打开地图,打算做些规划。
题目描述
他发现整个地图中有N(1<=N<=20000)个地点。对于所有的路线,指定了其中K(1<=K<=200,K<=N)个地点作为收费站。他设计了M(1<=M<=20000 )种单向的路线,第i条路线从地点Ui至Vi收费为Di(1<=Di<=10000)。路线保证Ui或Vi至少有一个是收费站,且Ui≠Vi,任意两个地点至多有一条路线。现在Awson准备进行规划。共提出Q(1<=Q<=50000)个询问,其中第i个询问是从地点Ai至地点Bi。请帮助他计算,每个请求是否满足(是否从地点Ai至地点Bi有可行路线),并计算:能满足的度假询问的最小费用总和。
输入输出格式
输入格式:
第1行:四个整数N,M,K,Q
第2~M+1行:三个整数Ui,Vi,Di
第M+2~M+K+1行:收费站的编号X (0<=X<=N)
第M+K+2~M+K+Q+1:两个整数,度假询问Ai,Bi
输出格式:
第1行:能够满足的度假询问数
第2行:能满足的度假询问的最小费用总和
输入输出样例
输入样例:
3 3 1 2
1 2 10
2 3 10
2 1 5
2
1 3
3 1
输出样例:
1
20
说明
样例解释:
第1个询问,路线设计为1->2->3,费用为20
第2个询问,无法满足
数据规模:
30%的数据有N<=100;
100%的数据有1<=N,M<=20000,1<=Q<=50000。
题解:
n很大,就算能O(1)求最短路也不行
但我们发现k很小,而且每条边至少有一个收费站
假设问u,v之间的最小距离,就是与u相邻的收费站与v的距离+边权
为包括u是收费站的情况,加入(u,u,0)边,修改部分会在代码中标记
题目转化为了求每个收费站到每个点的距离,用SPFA
复杂度为O(km+k*k)
询问部分可知一个点相邻的收费站最多为k,所以
询问复杂度为O(Q*k)
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- struct Node
- {
- int next,dis,to;
- }edge[];
- int head[],num,dist[][],q[],n,m,k,Q,p[],dis[][],b[],ans,cnt;
- bool vis[];
- void add(int u,int v,int d)
- {
- num++;
- edge[num].next=head[u];
- head[u]=num;
- edge[num].to=v;
- edge[num].dis=d;
- }
- void SPFA(int st,int j)
- {int h,t,i;;
- memset(dist[j],,sizeof(dist[j]));
- memset(vis,,sizeof(vis));
- q[]=st;
- h=;t=;
- dist[j][st]=;
- while (h<t)
- {
- h++;
- h%=;
- int u=q[h];
- vis[u]=;
- for (i=head[u];i;i=edge[i].next)
- {
- int v=edge[i].to;
- if (dist[j][v]>dist[j][u]+edge[i].dis)
- {
- dist[j][v]=dist[j][u]+edge[i].dis;
- if (!vis[v])
- {
- t++;
- t%=;
- q[t]=v;
- vis[v]=;
- }
- }
- }
- }
- for (i=;i<=k;i++)
- if (i!=j)
- dis[j][i]=dist[j][p[i]];
- }
- int main()
- {int i,j,u,v,d;
- cin>>n>>m>>k>>Q;
- edge[0].next=-1;
- for (i=;i<=m;i++)
- {
- scanf("%d%d%d",&u,&v,&d);
- add(u,v,d);
- }
- for (i=;i<=k;i++)
- {
- scanf("%d",&p[i]);
- b[p[i]]=i;
- }
- for (i=;i<=k;i++)
- {
- SPFA(p[i],i);
- }
- while (Q--)
- {
- scanf("%d%d",&u,&v);
- int s=1e9,x,y;
- if (b[u]&&b[v])
- {
- s=dis[b[u]][b[v]];
- }
- else
- for (i=head[u];i!=-1;i=edge[i].next)
- {
- 82 if (b[u]) i=0;
- 83 if (i==0) x=u;
- 84 else x=edge[i].to;
- if (b[x])
- {
- if (s>edge[i].dis+dist[b[x]][v])
- s=edge[i].dis+dist[b[x]][v];
- }
- }
- //cout<<s<<endl;
- if (s<1e9)
- ans+=s,cnt++;
- }
- cout<<cnt<<endl<<ans;
- }
[USACO13DEC]假期计划(黄金)Vacation Planning (gold)的更多相关文章
- 洛谷P3094 [USACO13DEC]假期计划Vacation Planning
题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100 ...
- [USACO 13DEC]Vacation Planning(gold)
Description Air Bovinia operates flights connecting the N farms that the cows live on (1 <= N < ...
- P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先 ...
- bzoj 4097: [Usaco2013 dec]Vacation Planning
4097: [Usaco2013 dec]Vacation Planning Description Air Bovinia is planning to connect the N farms (1 ...
- hihoCoder#1698 : 假期计划 组合数
题面:hihoCoder#1698 : 假期计划 组合数 题解: 题目要求是有序的排列,因此我们可以在一开始就乘上A!*B!然后在把这个序列划分成很多段. 这样的话由于乘了阶乘,所以所有排列我们都已 ...
- 洛谷P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L…
P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L… 题目描述 Farmer John's N cows (1 ≤ N ≤ 100,000) share many simi ...
- 「USACO15FEB」「LuoguP3121」审查(黄金)Censoring (Gold)(AC自动机
题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...
- 洛谷 P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L…
P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L… 题目描述 Farmer John's N cows (1 ≤ N ≤ 100,000) share many simi ...
- hihocoder #1698 假期计划 (排列组合+费马小定理+乘法逆元)
Description 小Ho未来有一个为期N天的假期,他计划在假期中看A部电影,刷B道编程题.为了劳逸结合,他决定先拿出若干天看电影,再拿出若干天刷题,最后再留若干天看电影.(若干代指大于0) 每 ...
随机推荐
- JavaScript之隐式类型转换
布尔操作符(!.&&.||) 当使用 条件判断语句(if...else) 以及 布尔操作符(!.&&.||) 时,会调用Boolean()进行隐式类型转换 转换为fal ...
- 项目Alpha冲刺Day8
一.会议照片 二.项目进展 1.今日安排 前端界面框架基本完成,剩下侧边栏与权限相关部分未完成.前端路由异常拦截完成.项目结构与开发流程规定完成.后台开发规定小变更. 2.问题困难 组件的拆分与否和组 ...
- 关于使用栈将一般运算式翻译为后缀表达式并实现三级运算的方法及实例(cpp版)
#include <iostream> #include <stack> #include <vector> #include <string> #de ...
- ThreadLocal源码分析:(二)get()方法
在ThreadLocal的get(),set()的时候都会清除线程ThreadLocalMap里所有key为null的value. 而ThreadLocal的remove()方法会先将Entry中对k ...
- Windows Powershell脚本执行
在cmd下执行powershell进入shell模式: 变量定义:$i = 10 $a = ifconfig | findstr "192" Windows下的命令都可以执行如: ...
- LeetCode & Q14-Longest Common Prefix-Easy
String Description: Write a function to find the longest common prefix string amongst an array of st ...
- C# 启动 SQL Server 服务
//首先要添加 System.ServiceProcess.dll 引用 ServiceController sc = new ServiceController("MSSQLSERVER& ...
- Python-进程与线程理论基础-Day10
进程与线程理论基础 1.背景知识 理论基础: 一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 二 多道技术: 1.产生背景 ...
- gradle入门(1-2)gradle的依赖管理
Gradle支持以下仓库格式: Ivy仓库 Maven仓库 Flat directory仓库 一.添加仓库 1.添加Ivy仓库 1.1.通过URL地址添加一个Ivy仓库 我们可以将以下代码片段加入到b ...
- JsonCPP库使用
1.使用环境DevC++ a.建立C++工程,并添加.\JsonCPP\jsoncpp-master\jsoncpp-master\src\lib_json中源文件到工程中. b.添加头文件路径 2. ...