这是一道dijkstra拓展......不知道为什么被评成了紫题。

有一个很朴素的想法就是每次松弛的时候判断一下那个点是否被保护。如果被保护就不入队。

然后发现写起来要改的地方巨多无比......

改到最后应该是用2/3个数组,分别表示最早可达时间(time),最早无防护时间(ruin)。以及一个取它们最大值的数组(ed),表示真实摧毁时间。

然后每次当一个点被某种更新之后入度变成0了,就用ed入队。

如果一个点出队了,就vis,然后不可被更新,然后更新某些点的入度,ruin和time。

这个正确性应该是有的:此后更新的每个点的ed都不会比当前点的ed小。

代码上两种更新的先后顺序不会影响结果。

  1. #include <cstdio>
  2. #include <queue>
  3. #include <algorithm>
  4. #define mp std::make_pair
  5.  
  6. typedef long long LL;
  7. const int N = , M = ;
  8. const LL INF = 1ll << ;
  9.  
  10. struct Edge {
  11. int nex, v;
  12. LL len;
  13. }edge[M << ], _edge[M << ]; int top, _top;
  14.  
  15. int e[N], _e[N], n, in[N];
  16. bool vis[N];
  17. LL time[N], ruin[N], ed[N];
  18.  
  19. inline void add(int x, int y, LL z) {
  20. top++;
  21. edge[top].v = y;
  22. edge[top].len = z;
  23. edge[top].nex = e[x];
  24. e[x] = top;
  25. return;
  26. }
  27.  
  28. inline void _add(int x, int y) {
  29. _top++;
  30. _edge[_top].v = y;
  31. _edge[_top].nex = _e[x];
  32. _e[x] = _top;
  33. return;
  34. }
  35.  
  36. std::priority_queue<std::pair<LL, int> > Q;
  37.  
  38. inline void BFS() {
  39.  
  40. Q.push(mp(-, ));
  41. ed[] = ;
  42. ruin[] = ;
  43. time[] = ;
  44.  
  45. int x;
  46. while(!Q.empty()) {
  47. x = Q.top().second;
  48. Q.pop();
  49. if(vis[x]) {
  50. continue;
  51. }
  52. vis[x] = ;
  53. for(int i = e[x]; i; i = edge[i].nex) {
  54. int y = edge[i].v;
  55. if(vis[y]) {
  56. continue;
  57. }
  58. if(time[y] > ed[x] + edge[i].len) {
  59. time[y] = ed[x] + edge[i].len;
  60. if(!in[y]) {
  61. ed[y] = std::max(ruin[y], time[y]);
  62. Q.push(mp(-ed[y], y));
  63. }
  64. }
  65. }
  66.  
  67. for(int i = _e[x]; i; i = _edge[i].nex) {
  68. int y = _edge[i].v;
  69. in[y]--;
  70. ruin[y] = std::max(ruin[y], ed[x]);
  71. if(!in[y]) {
  72. ed[y] = std::max(ruin[y], time[y]);
  73. Q.push(mp(-ed[y], y));
  74. }
  75. }
  76. }
  77.  
  78. if(ruin[n] >= INF) {
  79. printf("Mission Failed");
  80. return;
  81. }
  82. printf("%lld", std::max(ruin[n], time[n]) - );
  83.  
  84. /*for(int i = 1; i <= n; i++) {
  85. printf("%d ruin = %lld time = %lld \n", i, ruin[i], time[i]);
  86. }
  87. puts("");*/
  88.  
  89. return;
  90. }
  91.  
  92. int main() {
  93. //freopen("bomb.in", "r", stdin);
  94. //freopen("bomb.out", "w", stdout);
  95.  
  96. int m;
  97. scanf("%d%d", &n, &m);
  98. for(int i = , x, y; i <= m; i++) {
  99. LL z;
  100. scanf("%d%d%lld", &x, &y, &z);
  101. add(x, y, z);
  102. //add(y, x, z);
  103. }
  104. for(int i = , k, x; i <= n; i++) {
  105. scanf("%d", &k);
  106. for(int j = ; j <= k; j++) {
  107. scanf("%d", &x);
  108. _add(x, i);
  109. in[i]++;
  110. }
  111. time[i] = INF;
  112. }
  113. time[n] = INF;
  114.  
  115. BFS();
  116.  
  117. /*puts("");
  118. for(int i = 1; i <= n; i++) {
  119. printf("%d ruin = %lld time = %lld \n", i, ruin[i], *(time + i));
  120. }*/
  121.  
  122. return ;
  123. }

AC代码

洛谷P2446 大陆争霸的更多相关文章

  1. 洛谷 P2446 [SDOI2010]大陆争霸 解题报告

    P2446 [SDOI2010]大陆争霸 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭的神曾·布拉 ...

  2. 洛谷——P2446 [SDOI2010]大陆争霸

    https://www.luogu.org/problem/show?pid=2446#sub 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别 ...

  3. AC日记——[SDOI2010]大陆争霸 洛谷 P3690

    [SDOI2010]大陆争霸 思路: dijkstra模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn ...

  4. 【BZOJ1922】大陆争霸(最短路)

    [BZOJ1922]大陆争霸(最短路) 题面 BZOJ 洛谷 题解 最短路变形题. 定义\(dis\)表示最短路,\(d\)表示最早可以进入当前点的时间.显然\(d=max(max(dis_v,d_v ...

  5. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  6. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  7. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. Jvm 10 升级笔记

    移除了 JPEGCodec https://www.cnblogs.com/liaolongjun/p/6878359.html

  2. Redis常用操作--------SortedSet(有序集合)

    1.ZADD key score member [[score member] [score member] ...] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中. ...

  3. python基础学习笔记(二)

    继续第一篇的内容,讲解,python的一些基本的东西. 注释 为了让别人能够更容易理解程序,使用注释是非常有效的,即使是自己回头再看旧代码也是一样. >>> #获得用户名: > ...

  4. OC与JS的交互(iOS与H5混编)

    大神总结WKWebView的坑:https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA 在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景. iO ...

  5. js方法中拼接html时点击事件中拼接字符串参数

    1,代码 var html = '<a href="#" onclick="tableDelete(\''+ row.labelid +'\')"> ...

  6. spring boot之mybatis配置

    配置在application.yml文件中 mybatis-plus: # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Map ...

  7. 网络:LVS负载均衡原理

    LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上.为 ...

  8. mybatis中批量更新的问题

    问题:使用mybatis在执批量更新操作时,一直报错执行失败 解决方法: 首先打印了SQL语句,发现SQL语句拿出来执行没问题,也可以批量执行.SQL没问题,应该是配置的问题. 在网上查询和很多资料, ...

  9. ASP.NET MVC使用ADO.NET连接数据库

    深入理解ADO.NET友情链接:http://www.cnblogs.com/liuhaorain/category/352388.html 小白手把手:VS2017  SQL Server 2014 ...

  10. 《Multiplayer Game Programming》阅读笔记

    在图书馆发现一本<网络多人游戏架构与编程>-- Joshua Glazer, Sanjay Madhav 著.书挺新的,17年出版的,内容很有趣,翻一翻可以学到不少在<计算机网络&g ...