在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国。两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林·布拉泽。 幻想历 8012年 1月,杰森国正式宣布曾·布拉泽是他们唯一信仰的神,同 时开始迫害在杰森国的信仰斯普林·布拉泽的克里斯国教徒。 幻想历 8012年 3月2日,位于杰森国东部小镇神谕镇的克里斯国教徒发动 起义。 幻想历 8012年 3月7日,神谕镇的起义被杰森国大军以残酷手段镇压。 幻想历 8012年 3月8日,克里斯国对杰森国宣战。由数十万大军组成的克 里斯军团开至两国边境,与杰森军团对峙。 幻想历 8012年 4月,克里斯军团攻破杰森军团防线进入神谕镇,该镇幸存 的克里斯国教徒得到解放。 战争随后进入胶着状态,旷日持久。战况惨烈,一时间枪林弹雨,硝烟弥漫, 民不聊生。 幻想历 8012年 5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增。作为克里斯军团的主帅,你决定利用这一机 会发动奇袭,一举击败杰森国。

【题目描述】

杰森国有 N 个城市,由 M条单向道 路连接。神谕镇是城市 1而杰森国的首都是城市 N。你只需摧毁位于杰森国首都 的曾·布拉泽大神殿,杰森国的信仰,军队还有一切就都会土崩瓦解,灰飞烟灭。 为了尽量减小己方的消耗,你决定使用自爆机器人完成这一任务。唯一的困 难是,杰森国的一部分城市有结界保护,不破坏掉结界就无法进入城市。而每个 城市的结界都是由分布在其他城市中的一些结界发生器维持的,如果想进入某个 城市,你就必须破坏掉维持这个城市结界的所有结界发生器。 现在你有无限多的自爆机器人,一旦进入了某个城市,自爆机器人可以瞬间 引爆,破坏一个目标(结界发生器,或是杰森国大神殿),当然机器人本身也会 一起被破坏。你需要知道:摧毁杰森国所需的最短时间。

【输入格式】

第一行两个正整数 N, M。 接下来 M行,每行三个正整数 ui​, vi​, wi​,表示有一条从城市ui​到城市vi​的单向道路,自爆机器人通过这条道路需要wi​的时间。

之后 N 行,每行描述一个城市。首先是一个正整数 li​,维持这个城市结界所 使用的结界发生器数目。

之后li​个1~N 之间的城市编号,表示每个结界发生器的 位置。如果li = 0,则说明该城市没有结界保护。

保证l1 = 0。

【输出格式】

仅包含一个正整数 ,击败杰森国所需的最短时间。

这道题其实非常简单,dij+拓扑。

建两个图,一个是本来的图,还有一个是结界的拓扑图

开三个数组dis,time,ans。dis[i],time[i],ans[i]分别表示到i的最短路,i的所有结界最快能被破坏时间和i最快能被炸掉的时间(也就是最后的答案)

显然ans[i] = max(dis[i], time[i])。

另外我们还需要一个数组in来记录节点结界的数量,就像入度一样。

跑dij时跑两个图,一个原图,一个拓扑图。注意只有入度(in)为0时才能入队列。

#include <bits/stdc++.h>
using namespace std;
const int MAX = 10000000;
struct node{
int pre, to, val;
}e1[MAX], e2[MAX];
int h1[MAX], h2[MAX], tot1, tot2;
int n, m, in[MAX];
int read() {
int ret = 0, f = 1;
char ch = getchar();
while ('0' > ch || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while ('0' <= ch && ch <= '9') {
ret = ret * 10 + ch - '0';
ch = getchar();
}
return ret * f;
}
void write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
void push_e1(int u, int v, int t) {
e1[++tot1] = node{h1[u], v, t};
h1[u] = tot1;
}
void push_e2(int u, int v) {
e2[++tot2] = node{h2[u], v, 0};
h2[u] = tot2;
}
priority_queue<pair<int, int> > q;
bool vis[MAX];
int dis[MAX], ans[MAX], _time[MAX];
void dijkstra() {
memset(dis, 0x3f, sizeof(dis));
dis[1] = 0;
ans[1] = 0;
_time[1] = 0;
q.push(make_pair(0, 1));
while (!q.empty()) {
int x = q.top().second;
q.pop();
if (vis[x]) continue;
vis[x] = 1;
for (int i = h1[x]; i; i = e1[i].pre) {
int y = e1[i].to, z = e1[i].val;
if (dis[y] > ans[x] + z) {
dis[y] = ans[x] + z;
if (!in[y]) {
ans[y] = max(dis[y], _time[y]);
q.push(make_pair(-ans[y], y));
}
}
}
for (int i = h2[x]; i; i = e2[i].pre) {
int y = e2[i].to;
if (in[y]) {
in[y]--;
_time[y] = max(_time[y], ans[x]);
if (!in[y]) {
ans[y] = max(dis[y], _time[y]);
q.push(make_pair(-ans[y], y));
}
}
}
}
}
int main() {
n = read(), m = read();
for (int i = 1, u, v, t; i <= m; i++) {
u = read(), v = read(), t = read();
push_e1(u, v, t);
}
for (int i = 1; i <= n; i++) {
in[i] = read();
for (int j = 1, x; j <= in[i]; j++) {
x = read();
push_e2(x, i);
}
}
dijkstra();
write(ans[n]);
putchar('\n');
}

斯普林·布拉泽:我现在有无限个自爆机器人,嘿嘿嘿……

曾·布拉泽:额(⊙o⊙)…

 

GDOI#348大陆争霸[SDOI2010]最短路有限制条件的更多相关文章

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

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

  2. BZOJ1922 [Sdoi2010]大陆争霸 【最短路】

    题目 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林 ...

  3. bzoj 1922 [Sdoi2010]大陆争霸(最短路变形)

    Description 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光 ...

  4. 大陆争霸[SDOI2010]带限制最短路

    只要你有无限个自爆机器人,你就能为所欲为 斯普林·布拉泽 [题目描述] 略 一句话题意: 杰森国有 \(N\) 个城市,由 \(M\) 条单向道 路连接.杰森国的首都是城市 \(N\).你只需摧毁杰森 ...

  5. #348 大陆争霸(DIjkstra)

    在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林·布拉 ...

  6. BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)

    1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1154 Solved: 478 [Submit][Status ...

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

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

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

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

  9. bzoj1922 [SDOI2010]大陆争霸 分层图

    问题描述 幻想历8012年5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增.作为克里斯军团的主帅,你决定利用这一机会发动奇袭,一举 ...

随机推荐

  1. spark入门(二)RDD基础操作

    1 简述 spark中的RDD是一个分布式的元素集合. 在spark中,对数据的所有操作不外乎创建RDD,转化RDD以及调用RDD操作进行求值,而这些操作,spark会自动将RDD中的数据分发到集群上 ...

  2. HDU 6053:TrickGCD(莫比乌斯反演)

    题目链接 题意 给出n个数,问在这n个数里面,有多少组bi(1<=bi<=ai)可以使得任意两个bi不互质. 思路 想法就是枚举2~min(ai),然后去对于每个ai都去除以这些质数,然后 ...

  3. os.path.join路径拼接的问题

    问题一: import os a = os.path.join("/test1", "/test2") print(a) b = os.path.join(&q ...

  4. scrapy实战9动态设置ip代理从数据库中随机获取一个可用的ip:

    在目录下创建tools(python package) 在tools中创建crawl_xici_ip.py文件写入代码如下: #coding=utf-8 import requests from sc ...

  5. S7-1200 的运动控制

    S7-1200 CPU本体集成点硬件输出点最高频率为100kHz,信号板上硬件集成点输出的最高频率为20kHz,CPU在使用PTO功能时将把集成点Qa.o,Qa.2或信号板的Q4.0作为脉冲输出点,Q ...

  6. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  7. 不要再问我Java程序是怎么执行的了!

    什么是Java虚拟机? 要弄明白Java程序的执行过程首先要了解一下Java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构, ...

  8. leetcode的Hot100系列--3. 无重复字符的最长子串--滑动窗口

    可以先想下这两个问题: 1.怎样使用滑动窗口? 2.如何快速的解决字符查重问题? 滑动窗口 可以想象一下有两个指针,一个叫begin,一个叫now 这两个指针就指定了当前正在比较无重复的字符串,当再往 ...

  9. shell_umask用法

    我曾经用touch命令创建一个文件script,默认的权限是"rw-r- -r- -",有的朋友就有可能问为什么是这种组合?其实,这正是umask命令捣的鬼.在linux上输入:u ...

  10. WinForm控件之【Button】

    基本介绍 普通按钮大部分情况下用作页面对某系列操作后的提交确认,应用较为广泛,在winfrom控件当中使用设置都相对的简单. 常设置属性.事件 Image:控件上显示的图片: Enabled  :指示 ...