bzoj4093: [Usaco2013 Dec]Vacation Planning

bzoj4093: [Usaco2013 Dec]Vacation Planning

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 81  Solved: 38
[Submit][Status][Discuss]

Description

Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班。对于任何航班,指定了其中的k个农场作为枢纽。 (1 < = K <= 200 , K < = N)。

目前,共有M种单向航班( 1 < = M < = 20,000 ),第i个航班从农场u_i至农场v_i花费d_i ( 1 < = d_i < =10,000 )美元。航班保证u_i或者v_i至少有一个是枢纽,任意两个农场至多只有一个航班,保证u_i≠v_i。

Bessie负责票务服务。共收到Q个度假请求,(1 < = Q < = 50,000),其中第i个请求是从农场a_i至农场b_i 。请帮助她计算,每个请求是否满足 ,并计算:能满足的度假请求的最小费用总和。

Input

第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

Output

第1行:能够满足的度假请求数

第2行:能满足的度假请求的最小费用总和

Sample Input

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

Sample Output

1
20
【样例解释】
第1个请求,航线设计为1->2->3,费用为20
第2个请求,无法满足

HINT

Source

Gold

题解:

其实这题有双倍经验 同bzoj4097 然而数据范围大了一坨

跟上一题一样的 询问中的路径肯定会经过至少一个枢纽

设枢纽为x 则mincost=min{dis[u][x]+dis[x][v]}

由于是单向边 所以要把边反过来再跑一次最短路求出各点到枢纽的距离。。。

对于每个询问。。。枚举枢纽找出最小值即可

代码:

 1 #include<bits/stdc++.h>
 2 #define rep(i,l,r) for(int i=l;i<=r;++i)
 3 using namespace std;
 4 typedef long long ll;
 5 const int N=20023,inf=4e8;
 6 int dis[2][210][N],u,v,w,n,m,K,Q,s[N],head[N],tot,a[N],b[N],c[N],cnt;
 7 bool in[N];
 8 ll ans,mn;
 9 struct zs{
10     int to,next;
11     ll w;
12 }e[N];
13 inline void ins(int u,int v,int w){
14     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot; e[tot].w=w;
15 }
16 inline void spfa(int flag,int num){
17      queue<int>q; q.push(s[num]); dis[flag][num][s[num]]=0; in[s[num]]=1;
18      while(!q.empty()){
19          int x=q.front(); q.pop();
20          for(int k=head[x];k;k=e[k].next) if(dis[flag][num][x]+e[k].w<dis[flag][num][e[k].to]){
21              dis[flag][num][e[k].to]=dis[flag][num][x]+e[k].w;
22              if(!in[e[k].to]){
23                  in[e[k].to]=1;
24                  q.push(e[k].to);
25              }
26          }
27          in[x]=0;
28      }
29 }
30 int main(){
31     memset(dis,60,sizeof dis);
32     scanf("%d%d%d%d",&n,&m,&K,&Q);
33     rep(i,1,m) scanf("%d%d%d",&a[i],&b[i],&c[i]),ins(a[i],b[i],c[i]);
34     rep(i,1,K) scanf("%d",&s[i]);
35     rep(i,1,K) spfa(0,i);
36     memset(head,0,sizeof head); tot=0;
37     rep(i,1,m) ins(b[i],a[i],c[i]);
38     rep(i,1,K) spfa(1,i);
39     ans=0;
40     while(Q--){
41         scanf("%d%d",&u,&v);
42         mn=inf;
43         rep(i,1,K) mn=min(mn,(ll)(dis[0][i][v]+dis[1][i][u]));
44         if(mn!=inf)    ++cnt,ans+=mn;
45     }
46     printf("%d\n%lld\n",cnt,ans);
47 }

跑得极慢QAQ

时间: 2024-10-10 15:58:06

bzoj4093: [Usaco2013 Dec]Vacation Planning的相关文章

bzoj4097 [Usaco2013 dec]Vacation Planning

Description Air Bovinia is planning to connect the N farms (1 <= N <= 200) that the cows live on. As with any airline, K of these farms (1 <= K <= 100, K <= N) have been selected as hubs. The farms are conveniently numbered 1..N, with farms

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

最近刷水太多标注一下防止它淹没在silver的水题中--我成为了本题,第一个T掉的人QAQ [题目大意] Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班.对于任何航班,指定了其中的k个农场作为枢纽. (1 < = K <= 200 , K < = N). 目前,共有M种单向航班( 1 < = M < = 20,000 ),第i个航班从农场u_i至农场v_i花费d_i ( 1 < = d_i < =10,000 )美元.

【BZOJ4094】[Usaco2013 Dec]Optimal Milking 线段树

[BZOJ4094][Usaco2013 Dec]Optimal Milking Description Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号为1 ... N,并排成一行.第i台挤奶机每天能够挤M(i )单位的牛奶 (1 < =M(i) <=100,000).由于机器间距离太近,使得两台相邻的机器不能在同一天使用.Farmer Jo hn可以自由选择不同的机器集合在不同的日子进行挤奶.在D(1 < = D < = 50,00

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

题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100, K <= N). 当前共有M (1 <= M <= 10,000)条单向航线连接这些农场,从农场u_i 到农场 v_i, 将花费 d_i美元.(1 <= d_i <= 1,000,000). 航空公司最近收到Q (1 <= Q <= 10,000)个单向航行请求.

BZOJ4095 : [Usaco2013 Dec]The Bessie Shuffle

首先将排列和整个序列以及询问都反过来,问题变成给定一个位置$x$,问它经过若干轮置换后会到达哪个位置. 每次置换之后窗口都会往右滑动一个,因此其实真实置换是$p[i]-1$. 对于每个询问,求出轮数,倍增找到最终位置,注意当中途走到$0$时,说明离开了窗口,应及时终止. 时间复杂度$O((m+q)\log n)$. #include<cstdio> const int N=100010,M=30; int n,m,q,i,j,x,r,k,a[M][N]; inline void read(in

BZOJ 4094 Usaco2013 Dec Optimal Milking 线段树

题目大意:给定n个点排成一排,每个点有一个点权,多次改变某个点的点权并将最大点独立集计入答案,输出最终的答案 开一个线段树,每个点记录四个信息: 区间左端点不选,右端点也不选的最大值 区间左端点选择,右端点不选的最大值 区间左端点不选,右端点选择的最大值 区间左端点选择,右端点也选择的最大值 然后合并时讨论一下就行了 #include <cstdio> #include <cstring> #include <iostream> #include <algorit

[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 fl

BZOJ-USACO被虐记

bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 3889: [Usaco2015 Jan]Cow Routing 双键值最短路,预处理出代价跑一遍最短路就可以. ★3890: [Usaco2015 Jan]Meeting Time 维护一个小根堆,把边不断地插进去,然后维护一个ans,如果说ans>q.top().t且两个边权都走到n的话,就直接输出答案.否则答案只可能比当前答案还要大. 3891: [Usaco2014 Dec]Piggy Back 做3遍最短路,然

3314: [Usaco2013 Nov]Crowded Cows

3314: [Usaco2013 Nov]Crowded Cows Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 111  Solved: 79[Submit][Status][Discuss] Description Farmer John's N cows (1 <= N <= 50,000) are grazing along a one-dimensional fence. Cow i is standing at location x(