Description

Input

输入文件为secret.in :
第一行 包含一 个正整数 T,表示有 T组测试数据。接下来 依次是 T组测试数 据。
每组测试数 据的第一行包含两个整N、M。
第二行包含 N - 1个正整数,依次表示 A1,A2, …,AN-1。
接下来 M行,每 行为三个 整数: ui、vi、ci,表示一条连接城市ui和城市 vi的路程等于 ci的高速公路。

Output

输出文件为 secret.out 。
输出 T行, 依次 表示 每组测试数据 的答案 。若最优 方案 唯一 则输出 ”Yes”和 最小 代价 ,否则 输出 ”No ”和最小 代价 。字符串 和整数 之间 请用一个 空格 隔开 。

Sample Input

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

Sample Output

Yes 4
Yes 3
No 2

【样例解释】
第 1组测试数据: 最优 方案 是在城市 1设立 两个 检查点 。
第 2组测试数据: 最优 方案 是城市 1的高速公路 (1, 4 )的出入口设立 检查点。
第 3组测试数据: 最优 方案 是在城市 2设立 一个 检查点 ,不过 既可以 设置 在 高速公路 (1, 2)的出入 口,也可以 设置 在高速公路 (2, 3)的出入口 。

Data Constraint

对于 10% 的数据: 2 ≤ N ≤ 10 , 1 ≤ M ≤ 20。
另有 40% 的数据: 最优 方案 是唯一 的。
对于 10 0% 的数据: 2 ≤ N ≤ 400, 1 ≤ M ≤ 4 00 0,1 ≤ T ≤ 5,1 ≤ Ai, c ≤ 10^9。无向图可能 有重边 。

题解

我们来发掘发掘题目的条件。
我们发现,frank只能走最短路。
so
我们考虑把最短路图建出来。
怎么建?
先跑一边spfa,求出dis。
然后枚举每一条边,x和y。如果\(dis[x]+边的代价=dis[y]\)则证明这条边是最短路图的边。
跑两边bfs即可。
然后我们发现,每次设立一个检查点就是把一条边给标记成不可通过。
那么这不就是把多条边给割掉使得1与n不连通吗?
最小割!
有因为最小割=最大流
我们在最短路图上跑最大流即可。

问题来了,如何判断只有一种方案呢?
其实这就是一个最小割的唯一性的问题。
有一个很好的解决方案——
我们在残余网络中求出s能够到达的点的集合(容量为0的边不可走)
然后再从t跑一边,记录下t的集合。
如果一条边的两个端点分别是在s集合和t集合中。
则表示当前的边是必割边。
证明显然。
然后如果所有的必割边原来的容量加起来等于最大流,则证明只有一种方案。
证明?
其实一张图即可解决。

我们发现,上面这种情况中间的两条容量为0的边可以任意割1条。

还要注意:
由于这题的最小割唯一性判断有些奇妙。
因为是一条边的两个端点可以断。
所以把每条边拆成两条边即可。

标程

调到自闭

vari,j,k,l,n,m,x,y,z,flow,ll,tot,ans,t,head,tail,took,gs:longint;dis,va,a:array[1..4000] of int64;map,ttt,da:array[1..3000,1..3000] of int64;bz,ss,tt:array[1..4000] of boolean;pd,hav:array[1..3000,1..3000] of boolean;gap,gapv:array[0..5001] of int64;tov,next,last,cap:array[1..100000] of int64;flag:boolean;function min(x,y:longint):longint;
beginif x>y then exit(y);exit(x);
end;procedure insert(x,y,z:longint);
begininc(tot);tov[tot]:=y;next[tot]:=last[x];last[x]:=tot;cap[tot]:=z;inc(tot);tov[tot]:=x;next[tot]:=last[y];last[y]:=tot;cap[tot]:=0;
end;procedure dg(u:longint);
varmingap,llt,i,now:longint;
beginmingap:=n-1;llt:=ll;if u=n thenbegininc(flow,ll);flag:=true;exit;end;i:=last[u];while i>0 dobeginif cap[i]>0 thenbeginif gap[tov[i]]+1=gap[u] thenbeginif ll>cap[i] then ll:=cap[i];dg(tov[i]);if gap[1]>=n then exit;if flag thenbeginnow:=i;break;end;ll:=llt;end;if gap[tov[i]]<mingap then mingap:=gap[tov[i]];end;i:=next[i];end;if not flag thenbegindec(gapv[gap[u]]);if gapv[gap[u]]=0 then gap[1]:=n;gap[u]:=mingap+1;inc(gapv[gap[u]]);endelsebegindec(cap[now],ll);inc(cap[now xor 1],ll);end;
end;procedure spfa(dep:longint);
vari,j:longint;
beginfor i:=1 to n dobeginif map[a[dep],i]>0 thenbeginif dis[i]>map[a[dep],i]+dis[a[dep]] thenbegindis[i]:=map[a[dep],i]+dis[a[dep]];if bz[i] thenbeginbz[i]:=false;inc(took);a[took]:=i;end;end;end;end;bz[a[dep]]:=true;
end;
procedure bfs(dep:longint);
vari,j:longint;
beginfor i:=1 to n dobeginif map[a[dep],i]>0 thenbeginif bz[i] thenbeginbz[i]:=false;inc(took);a[took]:=i;end;if dis[i]=dis[a[dep]]+map[a[dep],i] thenbeginpd[a[dep],i]:=true;end;end;end;
end;
procedure find1(dep:longint);
vari,j:longint;
begini:=last[a[dep]];while i>0 dobeginif bz[tov[i]] thenbeginif cap[i]>0 thenbeginbz[tov[i]]:=false;ss[tov[i]]:=true;inc(took);a[took]:=tov[i];end;end;i:=next[i];end;
end;
procedure find2(dep:longint);
vari,j:longint;
begini:=last[a[dep]];while i>0 dobeginif bz[tov[i]] thenbeginif cap[i xor 1]>0 thenbeginbz[tov[i]]:=false;tt[tov[i]]:=true;inc(took);a[took]:=tov[i];end;end;i:=next[i];end;
end;begin//assign(input,'0data.in');reset(input);readln(t);while t>0 dobegindec(t);readln(n,m);for i:=1 to n-1 do read(va[i]);va[n]:=maxlongint;fillchar(map,sizeof(map),0);fillchar(ttt,sizeof(ttt),0);for i:=1 to m dobeginreadln(x,y,z);if (x=4) and (y=6) thenj:=j;if map[x,y]>0 thenbeginif map[x,y]>z thenbeginttt[x,y]:=1;map[x,y]:=z;endelseif map[x,y]=z then inc(ttt[x,y]);endelsebeginmap[x,y]:=z;ttt[x,y]:=1;end;map[y,x]:=map[x,y];ttt[y,x]:=ttt[x,y];end;head:=1;tail:=1;took:=1;fillchar(bz,sizeof(bz),true);bz[1]:=false;a[1]:=1;fillchar(dis,sizeof(dis),127);dis[1]:=0;repeatfor i:=head to tail do spfa(i);head:=tail+1;tail:=took;until head>tail;fillchar(pd,sizeof(pd),false);head:=1;tail:=1;took:=1;fillchar(bz,sizeof(bz),true);bz[1]:=false;a[1]:=1;repeatfor i:=head to tail do bfs(i);head:=tail+1;tail:=took;until head>tail;tot:=1;fillchar(last,sizeof(last),0);gs:=0;k:=0;for i:=1 to n-1 dofor j:=1 to n doif pd[i,j] theninc(gs,ttt[i,j]);fillchar(da,sizeof(da),0);for i:=1 to n-1 dofor j:=1 to n doif pd[i,j] thenbeginfor l:=1 to ttt[i,j] dobegininc(k);hav[i,k+n-1]:=true;da[i,k+n-1]:=va[i];insert(i,k+n-1,va[i]);if j=n thenbeginda[k+n-1,n+gs]:=va[j];insert(k+n-1,n+gs,va[j]);hav[k+n-1,n+gs]:=true;endelsebeginda[k+n-1,j]:=va[j];insert(k+n-1,j,va[j]);hav[k+n-1,j]:=true;end;end;end;n:=n+gs;fillchar(gap,sizeof(gap),0);fillchar(gapv,sizeof(gapv),0);gapv[0]:=n;flow:=0;while gap[1]<n dobeginll:=maxlongint;flag:=false;dg(1);end;k:=0;head:=1;tail:=1;took:=1;fillchar(bz,sizeof(bz),true);bz[1]:=false;a[1]:=1;fillchar(ss,sizeof(ss),false);ss[1]:=true;repeatfor i:=head to tail do find1(i);head:=tail+1;tail:=took;until head>tail;head:=1;tail:=1;took:=1;fillchar(bz,sizeof(bz),true);bz[n]:=false;a[1]:=n;fillchar(tt,sizeof(tt),false);tt[n]:=true;repeatfor i:=head to tail do find2(i);head:=tail+1;tail:=took;until head>tail;for i:=1 to n dobeginfor j:=1 to n dobeginif hav[i,j] thenbeginif (ss[i]) and (tt[j]) thenbegininc(k,da[i,j]);end;end;end;end;if k<>flow then write('No ') else write('Yes ');writeln(flow);end;
end.
end.

转载于:https://www.cnblogs.com/RainbowCrown/p/11166339.html

jzoj3348. 【NOI2013模拟】秘密任务相关推荐

  1. 【NOI2013模拟】棋盘游戏

    Description 有一个N*M的棋盘,初始每个格子都是白色的. 行操作是指选定某一行,将这行所有格子的颜色取反(黑白互换). 列操作是指选定某一列,将这列所有格子的颜色取反. XX进行了R次行操 ...

  2. [JZOJ3347] 【NOI2013模拟】树的难题

    题目 题目大意 给你一棵树,每个节点有三种黑.白.灰三种颜色. 你要割掉一些边(每条边被割需要付出一定的代价),使得森林的每棵树满足: 没有黑点或至多一个白点. 思考历程 这题一看就知道是一个树形DP ...

  3. 3360. 【NOI2013模拟】苹果树

    题目描述 神犇家门口种了一棵苹果树.苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条.由于这棵苹果树是神犇种的,所以苹 ...

  4. 圣诞老人python代码_秘密圣诞老人分类

    我正在开发一个程序,它将模拟秘密圣诞老人的分类帽.我试图让程序有一个错误陷阱,以防止人们获得自己的名字,但我不能让程序选择一个新的名称,如果有人得到自己的名字.我遇到的另一个问题是程序总是过早退出.在 ...

  5. 欢乐纪中某A组赛【2019.7.10】

    前言 好烦我最后写对了T1T1T1的808080分结果交错题导致T2T2T2的404040分没了T1T1T1也没拿多那些分. 话说好像ZDYZDYZDY比我还惨 成绩 这里还是按OJOJOJ上的分数排 ...

  6. 学习手记(2019/7/05~2019/8/31)——快乐暑假

    文章目录 二分答案的作用 堆和区间 很糙ddp 线段树合并 网络流结论の1 树上莫队 对角线与GCD 区间与扫描线与方案数 欧拉欧拉*1 斯坦纳树 切比雪夫距离 二分匹配结论の1 min-max容斥 ...

  7. 欢乐纪中某A组赛【2019.7.12】

    前言 暴力写挂垫底了呀\huge \color{red}\texttt{暴力写挂}\small\color{white}\\\texttt{垫底了呀}暴力写挂垫底了呀 %%%ZZYrank1\text ...

  8. 欢乐纪中某A组赛【2019.7.9】

    前言 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 心 ...

  9. 2019纪中暑假游记+总结

    Travels总篇\texttt{Travels总篇}Travels总篇 7/4\texttt{7/4}7/4 下午才去纪中,早上就一大早和同学出去玩,看了蜘蛛侠然后到3点多才出发. 因为走南沙大桥所 ...

  10. 上周AI热点回顾:AI“模拟”出暗物质、AI挖掘毕加索秘密、CPU在大型神经网络超越V100 GPU...

    01 全球首个AI宇宙模拟器跑出了暗物质 Space Engine是一款宇宙模拟游戏,它包含数千个真实的天体,包括来自HIP目录的恒星,来自NGC和IC目录的星系,几个知名的星云,以及所有已知的系外行 ...

最新文章

  1. 自然语言推理:微调BERT
  2. Linux系统中的Page cache和Buffer cache
  3. python--函数
  4. golang 字符串分割
  5. loss function
  6. UNP Chapter 27 - 客户-服务器程序其他设计方法
  7. java强制关闭远程桌面_elasticsearch中的java.io.IOException: 远程主机强迫关闭了一个现有的连接...
  8. WPF中的图表设计器 – 2
  9. 一文彻底明白linux中的selinux到底是什么
  10. 从0打卡leetcode之day 3 -- 最大子序列和
  11. ETL-informatica进阶资料整理
  12. Git 生成SSH Key 之使用PuTTYgen工具
  13. 极速版迅雷 服务器响应超时,迅雷登录超时怎么回事_迅雷经常登录超时如何解决...
  14. 最新表情包小程序+前后端去授权版/最火表情包小程序源码
  15. Python实现1~100猜数字小游戏
  16. win10 删除删除账户,新的账户中文件资源管理器图标变白 找回方法
  17. hdu5148 树形dp,分组背包
  18. 通过Auto Layout和Size Classes深入了解UIStackView的好处和使用
  19. STM32学习5——舵机控制
  20. 【第一性原理】Centos7下编译并行lammps-7Aug19

热门文章

  1. OSPFv3中LSA详解(三)——Network LSA变化
  2. Leetcode 刷题笔记(二十二) ——贪心算法篇之进阶题目
  3. HDOJ-1232 畅通工程
  4. python利用Tesseract识别验证码
  5. 【acl-访问控制列表】
  6. 慧荣科技亮相2017纽伦堡国际嵌入式应用展览会,主推采用3D NAND的BGA SSD新产品...
  7. C#设计模式之简单工厂模式
  8. 语句 if else
  9. HDU 5610 Baby Ming and Weight lifting
  10. Wordpress 太过牛