2015 BJOI 0102 Secret

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=477

试题描述:

在 MagicLand 这片神奇的大陆上,有样一个古老传说……
    许多年以前, MagicState 共和国刚成立的时候,反对新政府势力虽已被 共和国刚成立的时候,反对新政府势力虽已被 镇压,但仍在悄活动。这一次情报处得到了个令人震惊的消息镇压, 但仍在悄活动。这一次情报处得到了个令人震惊的消息镇压, 但仍在悄活动。这一次情报处得到了个令人震惊的消息镇压, 但仍在悄活动。这一次情报处得到了个令人震惊的消息被软禁在 首都府邸中的反对派领袖 Frank 已经秘密逃出首都,去往反对派的大本营。 已经秘密逃出首都,去往反对派的大本营。 根据得到的情报, Frank 计划通过 城市之间发达的高速公路,经计划通过 城市之间发达的高速公路,经尽量短的距离抵达目的地。
    我们不妨将当时的 MagicState 共和国 简化为 一个由 N个城市 、M条高速公路 构成 的连通 无向图 ,首都为城市 1,反对派的大本营为城市 N。每条高速公路连 接两个不同的城市, 且距离 已知。 而 Frank 选择了一条从城市 1到城市 N的最短 路径作为他的逃跑线。为了阻止 Frank , 共和国总统决定在一些城市的高速公路出入口设立检查点, 共和国总统决定在一些城市的高速公路出入口设立检查点在 Frank 通过检查点的时候将他拘捕。 举个例子来说,如果有一条高速公路连接 举个例子来说,如果有一条高速公路连接 城市 u和城市 v,在城市 u的这条公路出入口设立一个检查点,那么当 Frank 从 u到 v或从 v到 u时就会被检查出来。 特殊的是,由于城市 特殊的是,由于城市 N处在反对派的实 际控制下,所以在城市 N设立检查点是无效的。然而,在每个城市设立检查点都需要花费一定的经。 然而,在每个城市设立检查点都需要花费一定的经。 具体的 说,若在城市 说,若在城市 说,若在城市 i(1 <= i < N 1 <= i < N 1 <= i < N 1 <= i < N 1 <= i < N)设立 k个检查点,则要花费 Ai*k 的代价,其中 Ai是与城市 i相 关的参数。 值得注意的是,这 值得注意的是,这 代价与这 k个检查点具体设在哪些公路的出入口无关。于是,总统责成情报处拟定一个方案花费最小的代价使得无论 于是,总统责成情报处拟定一个方案花费最小的代价使得无论 于是,总统责成情报处拟定一个方案花费最小的代价使得无论 Fr ank 选择 哪条 最短 路线,都会在 除城市 N以外的 某个城市 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。 某条高速公路的出入口被拦截。
    读到这里,小宇也想计算一下拦截 读到这里,小宇也想计算一下拦截 Frank 所需要花费的最小代价,并且她还 所需要花费的最小代价,并且她还 想知道 最优 方案是否唯一的。于,她只好 求助于你了。
注:我们称两个方案不同当且仅存在某城市k,在两种方案中城市k的检查点设置是不同的。

输入:

第一行 包括一个正整数 T,表示有 T组数据。接下来分别描述 T组数据。
每组数 据的第一行包括两个正整N, M。第二行包括 。第二行包括 N-1个正整数,由空格 个正整数,由空格 隔开,依次表示 A1, A , A2, …, A , AN-1。接下来 M行,每三个正整数 u, v, c u, v, c u, v, c,描述 一条连接城市 u和城市 v的距离等于 c的高速公路。

输出:

包括 T行, 第 i行为第 i组数据的答案 。如果最优方案唯一,那么 如果最优方案唯一,那么 输出 ”Yes ”和一个整数表示最小代价,两者由空格隔开;否则输出 ”No ”和一
个整数表示最小代价,两者由空格隔开。

输入示例:

3
3 3
2 4
1 3 23
3 2 12
2 1 11
4 4
3 2 2
1 2 1
2 3 1
3 4 1
4 1 1
3 4
3 2
1 2 1
2 3 2
2 3 19
3 1 4

输出示例:

Yes 4
Yes 3
No 2

其他说明:

数据范围:0<T<6,1<N<401,0<M<4001,0<u,v<=N,0<Ai,c<=10^9。

题解:题目很长,翻译一下:给出一个点、 M条边的带正整数权值的向连通图。要求删掉一些边使得点1到点N的最短路径长度发生改变。对于删去的每条边可以花费等于两个端点中的任意一个( 除了点 N)的权的代价。求最少花费以及最优方案是否唯一。

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <cstring>
  4 using namespace std;
  5 typedef long long LL;
  6 const int maxn = 405;
  7 const int maxm = 4005;
  8 const LL INF = 1LL << 50;
  9 const int inf = 1 << 30;
 10
 11 struct Edge{
 12     int from, to, c, next;
 13     Edge(){}
 14     Edge(int e, int a, int b, int d){
 15         from = e; to = a; c = b; next = d;
 16     }
 17 } map[maxm << 2], edges[maxm << 2];
 18
 19 int first[maxn];
 20 int W[maxn];
 21 int n, m, ms, S, T;
 22 bool Is_only;
 23 LL ans;
 24
 25 void add_edge(int x, int y, int c){
 26     map[++ ms] = Edge(x, y, c, first[x]); first[x] = ms;
 27     return ;
 28 }
 29 void Init(){
 30     memset(first, 0, sizeof(first));
 31     scanf("%d%d", &n, &m);
 32     for (int i = 1; i < n; i ++) scanf("%d", &W[i]);
 33     int u, v, c;
 34     ms = 0;
 35     for (int i = 0; i < m; i ++){
 36         scanf("%d%d%d", &u, &v, &c);
 37         add_edge(u, v, c);
 38         add_edge(v, u, c);
 39     }
 40     return ;
 41 }
 42
 43 int que[maxn];
 44 LL Minc[maxn];
 45 LL Mins[maxn];
 46 LL Mint[maxn];
 47 bool inque[maxn];
 48
 49 void SPFA(int cur){
 50     for (int i = 1; i <= n; i ++) Minc[i] = INF, inque[i] = 0;
 51     int head = 0, tail = 1; Minc[cur] = 0; que[0] = cur;
 52     while (head != tail){
 53         int u = que[head ++]; if (head == maxn) head = 0; inque[u] = 0;
 54         for (int i = first[u]; i; i = map[i].next){
 55             int v = map[i].to;
 56             if (Minc[v] > Minc[u] + map[i].c){
 57                 Minc[v] = Minc[u] + map[i].c;
 58                 if (!inque[v]){
 59                     inque[v] = 1; que[tail ++] = v; if (tail == maxn) tail = 0;
 60                 }
 61             }
 62         }
 63     }
 64     for (int i = 1; i <= n; i ++)
 65         if (cur == 1) Mins[i] = Minc[i];
 66             else Mint[i] = Minc[i];
 67     return ;
 68 }
 69 void add_flow(int x, int y, int c){
 70     edges[ms] = Edge(x, y, c, first[x]); first[x] = ms ++;
 71     return ;
 72 }
 73 void Make_Graph(){
 74     memset(first, -1, sizeof(first));
 75     int m0 = ms; ms = 0;
 76     for (int i = 1; i <= m0; i ++){
 77         int u = map[i].from, v = map[i].to, c = map[i].c;
 78         if (Mins[u] + Mint[v] + c > Mins[n]) continue;
 79         int c0 = W[u]; if (v != n && W[v] < c0) c0 = W[v];
 80         add_flow(u, v, c0);
 81         add_flow(v, u, 0);
 82     }
 83     S = 1; T = n;
 84     return ;
 85 }
 86 int lev[maxn];
 87 bool Dinic_BFS(){
 88     memset(lev, -1, sizeof(lev));
 89     int head = 1, tail = 1; que[1] = S; lev[S] = 0;
 90     while (head <= tail){
 91         int u = que[head ++];
 92         for (int i = first[u]; i != -1; i = edges[i].next){
 93             int v = edges[i].to;
 94             if (lev[v] == -1 && edges[i].c)
 95                 lev[v] = lev[u] + 1, que[++ tail] = v;
 96         }
 97     }
 98     return lev[T] != -1;
 99 }
100 int Dinic_DFS(int u, int lim){
101     if (u == T) return lim;
102     int ret = 0;
103     for (int i = first[u]; i != -1 && ret < lim; i = edges[i].next){
104         int v = edges[i].to;
105         if (!edges[i].c || lev[v] != lev[u] + 1) continue;
106         int k = lim - ret; if (edges[i].c < k) k = edges[i].c;
107         k = Dinic_DFS(v, k); ret += k; edges[i].c -= k; edges[i^1].c += k;
108     }
109     if (!ret) lev[u] = -1;
110     return ret;
111 }
112 int vis[maxn];
113 void DFS1(int u){
114     vis[u] = 1;
115     for (int i = first[u]; i != -1; i = edges[i].next) if (edges[i].c)
116         if (!vis[edges[i].to]) DFS1(edges[i].to);
117     return ;
118 }
119 void DFS2(int u){
120     vis[u] = 2;
121     for (int i = first[u]; i != -1; i = edges[i].next) if (edges[i ^ 1].c)
122         if (!vis[edges[i].to]) DFS2(edges[i].to);
123     return ;
124 }
125 int Fee(int x, int y){
126     if (y == n) return W[x];
127     return W[x] < W[y] ? W[x] : W[y];
128 }
129 bool Solve(){
130     memset(vis, 0, sizeof(vis));
131     DFS1(S); DFS2(T);
132     LL sum = 0;
133     for (int i = 1; i < n; i ++) if (vis[i] == 1){
134         for (int j = first[i]; j != -1; j = edges[j].next){
135             int v = edges[j].to;
136             if (vis[v] == 2 && !(j & 1)){//a forward edge in the MinCut
137                 if (W[i] == W[v]) return 0;
138                 sum += Fee(i, v);
139             }
140         }
141     }
142     return sum == ans;
143 }
144 void work(){
145     SPFA(1); SPFA(n);
146     Make_Graph();
147     ans = 0;
148     while (Dinic_BFS()) ans += Dinic_DFS(S, inf);
149     Is_only = Solve();
150     return ;
151 }
152 void Print(){
153     if(Is_only) printf("Yes %lld\n", ans);
154     else printf("No %lld\n", ans);
155     return ;
156 }
157 int main(){
158     int T;
159     scanf("%d", &T);
160     while (T --){
161         Init();
162         work();
163         Print();
164     }
165     return 0;
166 }

题目:罗剑桥

时间: 2024-10-23 13:34:40

2015 BJOI 0102 Secret的相关文章

阿尔红军我让我特我问题沃特尔行业

http://www.houzz.com/ideabooks/38419124/thumbs/2015.01.04 http://www.houzz.com/ideabooks/38419135/thumbs/2015.01.04 http://www.houzz.com/ideabooks/38419147/thumbs/2015.01.04 http://www.houzz.com/ideabooks/38419107/thumbs/2015.01.04 http://www.houzz.c

哪敢跟学长这么

不少人面庞上有不由得惊呼出声http://weibo.com/09.16/2015/p/1001603887569338240338http://weibo.com/09.16/2015/p/1001603887569338268443http://weibo.com/09.16/2015/p/1001603887569342462767http://weibo.com/09.16/2015/p/1001603887569342462769http://weibo.com/09.16/2015/

右手缓缓握拢而

火红烈日炸裂的一路冲杀进去吧http://weibo.com/2015/09/16/p/1001603887216807041204http://weibo.com/2015/09/16/p/1001603887216811186273http://weibo.com/2015/09/16/p/1001603887216811186277http://weibo.com/2015/09/16/p/1001603887216811235528http://weibo.com/2015/09/16/

叶轻灵苦笑一声

灵光刚刚收起时灵兵潮流尽数的牧尘准备不错http://weibo.com/2015.09.16/p/1001603887492385369004http://weibo.com/2015.09.16/p/1001603887492389563376http://weibo.com/2015.09.16/p/1001603887492393757752http://weibo.com/2015.09.16/p/1001603887492397975161http://weibo.com/2015.

百度是否会骄傲是罚款撒家乐福

http://www.ebay.com/cln/koyche_0293/-/167468813012/2015.02.10 http://www.ebay.com/cln/x_l0513/-/167468823012/2015.02.10 http://www.ebay.com/cln/lhu9368/-/167461855010/2015.02.10 http://www.ebay.com/cln/lonb759/-/167364514017/2015.02.10 http://www.eba

百度的说法矿石结晶发神经

http://www.ebay.com/cln/zhay285/cars/167540455015/2015.02.09 http://www.ebay.com/cln/j-nen73/cars/167540456015/2015.02.09 http://www.ebay.com/cln/jin.p82/cars/167427490013/2015.02.09 http://www.ebay.com/cln/x-x6813/cars/167540459015/2015.02.09 http:/

百度得换个房间是否可使肌肤

http://www.ebay.com/cln/fenxi76/cars/167208337017/2015.02.09 http://www.ebay.com/cln/becn195/cars/167283623014/2015.02.09 http://www.ebay.com/cln/sh.sho7/cars/167306609010/2015.02.09 http://www.ebay.com/cln/zhji215/cars/167208345017/2015.02.09 http:/

百度恢复健康撒谎房间撒开了家发牢骚家乐福

http://www.ebay.com/cln/penya71/book/167561481013/2015.02.08 http://www.ebay.com/cln/lan-y87/book/167515536016/2015.02.08 http://www.ebay.com/cln/razan09/book/167561485013/2015.02.08 http://www.ebay.com/cln/jixia78/book/167678907015/2015.02.08 http:/

百度福建客户是否将失联客机法拉盛

http://www.ebay.com/cln/zudon36/book/167336542017/2015.02.08 http://www.ebay.com/cln/cefa050/book/167707562015/2015.02.08 http://www.ebay.com/cln/bicn417/book/167440260012/2015.02.08 http://www.ebay.com/cln/zhu-s31/book/167236817019/2015.02.08 http:/