https://www.luogu.org/problem/show?pid=2446#sub

题目背景

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

幻想历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。你只需摧毁位于杰森国首都的曾·布拉泽大神殿,杰森国的信仰,军队还有一切就都会土崩瓦解,灰飞烟灭。

为了尽量减小己方的消耗,你决定使用自爆机器人完成这一任务。唯一的困难是,杰森国的一部分城市有结界保护,不破坏掉结界就无法进入城市。而每个城市的结界都是由分布在其他城市中的一些结界发生器维持的,如果想进入某个城市,你就必须破坏掉维持这个城市结界的所有结界发生器。

现在你有无限多的自爆机器人,一旦进入了某个城市,自爆机器人可以瞬间引爆,破坏一个目标(结界发生器,或是杰森国大神殿),当然机器人本身也会一起被破坏。你需要知道:摧毁杰森国所需的最短时间。

输入输出格式

输入格式:

输入文件的landcraft.in的第一行两个正整数N, M。

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

之后N行,每行描述一个城市。首先是一个正整数li,维持这个城市结界所使用的结界发生器数目。之后li个1~N之间的城市编号,表示每个结界发生器的位置。如果li = 0,则说明该城市没有结界保护,保证l1 = 0 。

输出格式:

输出文件landcraft.out仅包含一个正整数 ,击败杰森国所需的最短时间。

输入输出样例

输入样例#1:

6 6
1 2 1
1 4 3
2 3 1
2 5 2
4 6 2
5 3 2
0
0
0
1 3
0
2 3 5
输出样例#1:

5

说明

对于20%的数据,满足N≤15,M≤50;

对于50%的数据,满足N≤500,M≤6,000;

对于100%的数据,满足N≤3,000,M≤70,000,1≤wi≤108。

输入数据保证一定有解,且不会存在维持某个城市结界的结界发生器在这个城市内部。

连接两个城市的道路可能不止一条,也可能存在一个城市自己到自己的道路。

用dis[i]记录到i点的路径距离,dits[i]记录炸掉i的用时

最短路两者取大

堆优化dijkstra:

 #include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue> #define LL long long using namespace std; const int N(+);
const int M(+);
int n,m,rd[N],u,v,w; int hed[N],had[N],sumedge;
struct Edge
{
int u,v,w,next;
Edge(int u=,int v=,int w=,int next=):
u(u),v(v),w(w),next(next){}
}edge[M];
void ins(int u,int v,int w,int *head)
{
edge[++sumedge]=Edge(u,v,w,head[u]);
head[u]=sumedge;
} priority_queue<pair<LL,int>,vector<pair<LL,int> >,greater<pair<LL,int> > >que;
LL cost,MAX,dis[N],dist[N];
int fro,vis[N];
void Dijkstra()
{
memset(dis,0x3f,sizeof(dis));
que.push(make_pair(,));
dis[]=;
while(!que.empty())
{
fro=que.top().second; que.pop();
if(vis[fro]) continue;
vis[fro]=;
MAX=max(dis[fro],dist[fro]);
for(int i=hed[fro];i;i=edge[i].next)
{
int to=edge[i].v;
if(MAX+edge[i].w<dis[to])
{
dis[to]=MAX+edge[i].w;
cost=max(dis[to],dist[to]);
if(!rd[to]) que.push(make_pair(cost,to));
}
}
for(int i=had[fro];i;i=edge[i].next)
{
int to=edge[i].v;
rd[to]--;
dist[to]=max(MAX,dist[to]);
cost=max(dis[to],dist[to]);
if(!rd[to]) que.push(make_pair(cost,to));
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(;m--;)
scanf("%d%d%d",&u,&v,&w),ins(u,v,w,hed);
for(int i=;i<=n;i++)
{
scanf("%d",&rd[i]);
for(int j=;j<=rd[i];j++)
scanf("%d",&v),ins(v,i,,had);
}
Dijkstra();
printf("%d\n",max(dis[n],dist[n]));
return ;
}

洛谷——P2446 [SDOI2010]大陆争霸的更多相关文章

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

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

  2. P2446 [SDOI2010]大陆争霸

    \(\color{#0066ff}{ 题目描述 }\) 幻想历8012年5月12日深夜,斯普林·布拉泽降下神谕:"Trust me, earn eternal life."克里斯军 ...

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

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

  4. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  5. BZOJ1925或洛谷2467 [SDOI2010]地精部落

    BZOJ原题链接 洛谷原题链接 先讲下关于波动数列的\(3\)个性质. 性质\(1\):对于数列中的每一对\(i\)和\(i + 1\),若它们不相邻,那么交换这两个数形成的依旧是一个波动数列. 性质 ...

  6. 洛谷 P2467 [SDOI2010]地精部落

    洛谷 我讲的应该没有这个[https://www.luogu.org/blog/user55639/solution-p2467]清楚. 贴个代码算了: #include <bits/stdc+ ...

  7. 洛谷 P2481 [SDOI2010]代码拍卖会

    洛谷 这大概是我真正意义上的第一道黑题吧! 自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解. 一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\ ...

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

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

  9. 洛谷P2468 [SDOI2010]粟粟的书架

    来了来了,随便拽一道题写题解[大雾] 最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场… 发现了这么一道二合一的题. 这道题其实分成两个部分,前50%是一 ...

随机推荐

  1. Block的使用--初探Block

    看了两天的Block. 网上是有非常多解说与教程,也有讲得非常好的.这里就主要解说下我的理解与收获.欢迎拍砖. 所谓block.我觉得应该是一个闭包函数.而闭包,就是说block以及内部全部的变量生命 ...

  2. BZOJ 1251 Splay维护序列

    思路: splay维护序列的裸题 啊woc调了一天 感谢yzy大佬的模板-- //By SiriusRen #include <cstdio> #include <cstring&g ...

  3. asp.net导出execl和图片

    个人常用导出execl方法: #region "导出文档" /// <summary> /// Export("application/ms-excel&qu ...

  4. 洛谷P2839 [国家集训队]middle 主席树_二分

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...

  5. 【Git 三】生成并添加SSH秘钥

    我们在 Windos 或 Linux 上克隆项目的时候, 如果走的是 http 会让输入 username 和 password,每次都要输入是很麻烦的. 为了省事儿.简单,我们可以选择 ssh 方式 ...

  6. Highcharts 前端图表插件

    Highcharts 支持将图片下载成各种格式 Highcharts官网:https://www.hcharts.cn/download <div id="container" ...

  7. NodeJS学习笔记 (18)基础调试-console(ok)

    模块概览 console模块提供了基础的调试功能.使用很简单,常用的API主要有 console.log().console.error(). 此外,可以基于Console类,方便的扩展出自己的con ...

  8. 一个最不可思议的MySQL死锁分析

    1    死锁问题背景    1 1.1    一个不可思议的死锁    1 1.1.1    初步分析    3 1.2    如何阅读死锁日志    3 2    死锁原因深入剖析    4 2. ...

  9. HTML学习----------DAY2第五节

    属性为 HTML 元素提供附加信息. HTML 属性 HTML 标签可以拥有属性.属性提供了有关 HTML 元素的更多的信息. 属性总是以名称/值对的形式出现,比如:name="value& ...

  10. [Recompose] Configure Recompose to Build React Components from RxJS Streams

    Recompose provides helper functions to stream props using an Observable library of your choice into ...