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

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

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

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

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

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

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

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

 #include <cstdio>
#include <queue>
#include <algorithm>
#define mp std::make_pair typedef long long LL;
const int N = , M = ;
const LL INF = 1ll << ; struct Edge {
int nex, v;
LL len;
}edge[M << ], _edge[M << ]; int top, _top; int e[N], _e[N], n, in[N];
bool vis[N];
LL time[N], ruin[N], ed[N]; inline void add(int x, int y, LL z) {
top++;
edge[top].v = y;
edge[top].len = z;
edge[top].nex = e[x];
e[x] = top;
return;
} inline void _add(int x, int y) {
_top++;
_edge[_top].v = y;
_edge[_top].nex = _e[x];
_e[x] = _top;
return;
} std::priority_queue<std::pair<LL, int> > Q; inline void BFS() { Q.push(mp(-, ));
ed[] = ;
ruin[] = ;
time[] = ; int x;
while(!Q.empty()) {
x = Q.top().second;
Q.pop();
if(vis[x]) {
continue;
}
vis[x] = ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(vis[y]) {
continue;
}
if(time[y] > ed[x] + edge[i].len) {
time[y] = ed[x] + edge[i].len;
if(!in[y]) {
ed[y] = std::max(ruin[y], time[y]);
Q.push(mp(-ed[y], y));
}
}
} for(int i = _e[x]; i; i = _edge[i].nex) {
int y = _edge[i].v;
in[y]--;
ruin[y] = std::max(ruin[y], ed[x]);
if(!in[y]) {
ed[y] = std::max(ruin[y], time[y]);
Q.push(mp(-ed[y], y));
}
}
} if(ruin[n] >= INF) {
printf("Mission Failed");
return;
}
printf("%lld", std::max(ruin[n], time[n]) - ); /*for(int i = 1; i <= n; i++) {
printf("%d ruin = %lld time = %lld \n", i, ruin[i], time[i]);
}
puts("");*/ return;
} int main() {
//freopen("bomb.in", "r", stdin);
//freopen("bomb.out", "w", stdout); int m;
scanf("%d%d", &n, &m);
for(int i = , x, y; i <= m; i++) {
LL z;
scanf("%d%d%lld", &x, &y, &z);
add(x, y, z);
//add(y, x, z);
}
for(int i = , k, x; i <= n; i++) {
scanf("%d", &k);
for(int j = ; j <= k; j++) {
scanf("%d", &x);
_add(x, i);
in[i]++;
}
time[i] = INF;
}
time[n] = INF; BFS(); /*puts("");
for(int i = 1; i <= n; i++) {
printf("%d ruin = %lld time = %lld \n", i, ruin[i], *(time + i));
}*/ return ;
}

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. 【变态需求】bootstrapTable列排序-选择正序倒序不排序

    产品经理:那个table排序能不能点击后弹个选项选择正序倒序不排序? -- 那个是bootstrapTable的插件!不支持!改不了!! 注意:数据上假的,效果看http请求参数进行脑补 这是boot ...

  2. EF_DataFrist遇到的问题

    正在 Code First 模式下将此上下文与从 EDMX 文件生成的用于 Database First 或 Model First 开发的代码一起使用.这将无法正常工作.若要解决此问题,请不要删除引 ...

  3. 行业干货-如何逆向解决QT程序汉化中乱码问题

    前言 “一款QT开发的国外软件,大概率是没有做中文支持的,所以你汉化中,不论怎么设置编码都一定是乱码.面对这个问题,你去互联网上找答案,答案却大多是复制粘贴的开发中解决乱码的文章,可是我们是要逆向中解 ...

  4. Docker环境编译时的错误记录

    1)报错一docker-compose -f compose/app.yaml -f compose/backend.yaml -f compose/proxy.yaml build peatio b ...

  5. LVM常规操作记录梳理(扩容/缩容/快照等)

    基本介绍Linux用户安装Linux 操作系统时遇到的一个最常见的难以决定的问题就是如何正确地给评估各分区大小,以分配合适的硬盘空间.随着 Linux的逻辑盘卷管理功能的出现,这些问题都迎刃而解, l ...

  6. ecna2017-Game of Throwns

    这题就是给你一个标号为0-n-1的环,然后给你M个操作,操作有两种,一种是直接给一个数,这数的正负代表我当前向前(向后)仍了xx个位置的球,或者给你一个撤销操作表示为 undo m,表示撤销最近的M个 ...

  7. 个人作业Week1

    一.<构建之法>提问 1.需求是什么?需求的规范需要明确吗? 2.一个人开发效率非常高,多人开发,个人效率随团队人数上升而直线下降,我们一般需要将大项目拆为小项目,使协作耦合产生的效率负影 ...

  8. 《linux内核设计与实现》第十八章

    第十八章 调试 调试工作艰难是内核级开发区别于用户级开发的一个显著特点. 一.准备开始 1.内和调试需要什么 一个bug(大部分bug通常都不是行为可靠而且定义明确的) 一个藏匿bug的内核版本(知道 ...

  9. Junit4测试用例

    一.题目简介 测试一元一次方程的求解 二.源码的github链接 https://github.com/liujing1994/test1 三.所设计的模块测试用例.测试结果截图   一元一次方程测试 ...

  10. ### The error may involve defaultParameterMap ### The error occurred while setting parameters

    Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty; bad SQL grammar [ ...