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)的权的代价。求最少花费以及最优方案是否唯一。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = ;
const int maxm = ;
const LL INF = 1LL << ;
const int inf = << ; struct Edge{
int from, to, c, next;
Edge(){}
Edge(int e, int a, int b, int d){
from = e; to = a; c = b; next = d;
}
} map[maxm << ], edges[maxm << ]; int first[maxn];
int W[maxn];
int n, m, ms, S, T;
bool Is_only;
LL ans; void add_edge(int x, int y, int c){
map[++ ms] = Edge(x, y, c, first[x]); first[x] = ms;
return ;
}
void Init(){
memset(first, , sizeof(first));
scanf("%d%d", &n, &m);
for (int i = ; i < n; i ++) scanf("%d", &W[i]);
int u, v, c;
ms = ;
for (int i = ; i < m; i ++){
scanf("%d%d%d", &u, &v, &c);
add_edge(u, v, c);
add_edge(v, u, c);
}
return ;
} int que[maxn];
LL Minc[maxn];
LL Mins[maxn];
LL Mint[maxn];
bool inque[maxn]; void SPFA(int cur){
for (int i = ; i <= n; i ++) Minc[i] = INF, inque[i] = ;
int head = , tail = ; Minc[cur] = ; que[] = cur;
while (head != tail){
int u = que[head ++]; if (head == maxn) head = ; inque[u] = ;
for (int i = first[u]; i; i = map[i].next){
int v = map[i].to;
if (Minc[v] > Minc[u] + map[i].c){
Minc[v] = Minc[u] + map[i].c;
if (!inque[v]){
inque[v] = ; que[tail ++] = v; if (tail == maxn) tail = ;
}
}
}
}
for (int i = ; i <= n; i ++)
if (cur == ) Mins[i] = Minc[i];
else Mint[i] = Minc[i];
return ;
}
void add_flow(int x, int y, int c){
edges[ms] = Edge(x, y, c, first[x]); first[x] = ms ++;
return ;
}
void Make_Graph(){
memset(first, -, sizeof(first));
int m0 = ms; ms = ;
for (int i = ; i <= m0; i ++){
int u = map[i].from, v = map[i].to, c = map[i].c;
if (Mins[u] + Mint[v] + c > Mins[n]) continue;
int c0 = W[u]; if (v != n && W[v] < c0) c0 = W[v];
add_flow(u, v, c0);
add_flow(v, u, );
}
S = ; T = n;
return ;
}
int lev[maxn];
bool Dinic_BFS(){
memset(lev, -, sizeof(lev));
int head = , tail = ; que[] = S; lev[S] = ;
while (head <= tail){
int u = que[head ++];
for (int i = first[u]; i != -; i = edges[i].next){
int v = edges[i].to;
if (lev[v] == - && edges[i].c)
lev[v] = lev[u] + , que[++ tail] = v;
}
}
return lev[T] != -;
}
int Dinic_DFS(int u, int lim){
if (u == T) return lim;
int ret = ;
for (int i = first[u]; i != - && ret < lim; i = edges[i].next){
int v = edges[i].to;
if (!edges[i].c || lev[v] != lev[u] + ) continue;
int k = lim - ret; if (edges[i].c < k) k = edges[i].c;
k = Dinic_DFS(v, k); ret += k; edges[i].c -= k; edges[i^].c += k;
}
if (!ret) lev[u] = -;
return ret;
}
int vis[maxn];
void DFS1(int u){
vis[u] = ;
for (int i = first[u]; i != -; i = edges[i].next) if (edges[i].c)
if (!vis[edges[i].to]) DFS1(edges[i].to);
return ;
}
void DFS2(int u){
vis[u] = ;
for (int i = first[u]; i != -; i = edges[i].next) if (edges[i ^ ].c)
if (!vis[edges[i].to]) DFS2(edges[i].to);
return ;
}
int Fee(int x, int y){
if (y == n) return W[x];
return W[x] < W[y] ? W[x] : W[y];
}
bool Solve(){
memset(vis, , sizeof(vis));
DFS1(S); DFS2(T);
LL sum = ;
for (int i = ; i < n; i ++) if (vis[i] == ){
for (int j = first[i]; j != -; j = edges[j].next){
int v = edges[j].to;
if (vis[v] == && !(j & )){//a forward edge in the MinCut
if (W[i] == W[v]) return ;
sum += Fee(i, v);
}
}
}
return sum == ans;
}
void work(){
SPFA(); SPFA(n);
Make_Graph();
ans = ;
while (Dinic_BFS()) ans += Dinic_DFS(S, inf);
Is_only = Solve();
return ;
}
void Print(){
if(Is_only) printf("Yes %lld\n", ans);
else printf("No %lld\n", ans);
return ;
}
int main(){
int T;
scanf("%d", &T);
while (T --){
Init();
work();
Print();
}
return ;
}
题目:罗剑桥
2015 BJOI 0102 Secret的更多相关文章
- (纪录片)现代生活的秘密规则:算法 The Secret Rules of Modern Living: Algorithms
简介: The Secret Rules of Modern Living: Algorithms (2015) 导演: David Briggs主演: Marcus du Sautoy类型: 纪录片 ...
- [转]13 Hours: The Secret Soldiers of Benghazi
转:http://www.imfdb.org/wiki/13_Hours:_The_Secret_Soldiers_of_Benghazi The following weapons were use ...
- 15 Most Read Data Science Articles in 2015. So far …
15 Most Read Data Science Articles in 2015. So far … We've compiled the latest set of "most rea ...
- 【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
问题描述 创建一个Java Console程序,用于使用Azure Key Vault Secret.在VS Code中能正常Debug,但是通过mvn clean package打包为jar文件后, ...
- 2015 西雅图微软总部MVP峰会记录
2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint
前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...
- TFS 2015 敏捷开发实践 – 看板的使用
看板在现代应用开发过程中使用非常广泛,不管是使用传统的瀑布式开发还是敏捷开发,都可以使用看板管理.因为看板拥有简单的管理方法,直观的显示方式,所以很多软件开发团队选择使用看板进行软件开发管理.本文不在 ...
- Microsoft Visual Studio 2015 下载、注册、安装过程、功能列表、问题解决
PS:请看看回复.可能会有文章里没有提到的问题.也许会对你有帮助哦~ 先上一张最终的截图吧: VS2015正式版出了,虽然没有Ultimate旗舰版,不过也是好激动的说.哈哈.可能有的小伙伴,由于工作 ...
随机推荐
- SQL Server2005 表分区三步曲(zz)
前言 SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上.每一个表分区都和在某个文件 组(filegroup)中的单个文件关联.同样的一个文件/文件组可以容纳 ...
- js 高阶函数 filter
filter用于过滤array中的一些值,通过带入的函数返回的ture 或false 保留或去除,返回一个新的array filter 使用演示:判断筛选出array中的素数: //判断素数自定义函数 ...
- ubuntu下的openfire安装、配置、运行
openfire服务器 Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议.您可以使用它轻易的构建高效率的即时通信服务器.Op ...
- CGLIB学习笔记
0 概述 CGLIB基于ASM实现.提供比反射更为强大的动态特性.使用CGLIB可以非常方便的实现的动态代理. 0.1 CGLIB包结构 net.sf.cglib.core 底层字节码处理类. ...
- maven jetty运行命令
1.先运行build.xml <?xml version="1.0" encoding="UTF-8"?> <project name=&qu ...
- HBuilder+移动APP开发实例
mui: 官网:http://dcloudio.github.io/mui/ 说明:一般要把官网内容通读一遍,这是开发的基础 开始 1.新建项目 在首页点击新建移动App,如下: 或者在项目管理器内右 ...
- Intellij Idea 13 vmoptions (Mac版本)
-ea -server -Xms1g -Xmx1g -Xss16m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DoEscapeAnalysis -XX:+ ...
- Linux系统swap已分区但无法挂载与cryptswap1问题
linux下察看swap分区大小的命令 top 或者fdisk -l 或者free -m SWAP分区一般大小为物理内存的2倍,但最大不超过2G; 增加SWAP空间的方法有两个:增加另外一个SWAP分 ...
- 转: Oracle AWR 报告 每天自动生成并发送邮箱
原贴地址:http://www.cnblogs.com/vigarbuaa/archive/2012/09/05/2671794.html Oracle AWR 介绍http://blog.csdn. ...
- 静态方法块 static 以及对象属性&类属性的用法
使用静态块的好处:只要在类被加载时,static块就会被调用,整个过程就调用这么一次,不会在后面的对象处又不断的调用.如果不使用它,就会出现如下问题:new一个对象,我就要调用一次所需的这些内容,重复 ...