题目描述

在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国。两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林·布拉泽。 幻想历 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行,每行三个正整数 uiui​,vivi,wiwi,表示有一条从城市ui​到城市vi的单向道路,自爆机器人通过这条道路需要wiwi的时间。 之后 N 行,每行描述一个城市。首先是一个正整数 li,维持这个城市结界所 使用的结界发生器数目。之后lili个1~N 之间的城市编号,表示每个结界发生器的 位置。如果lili​=0,则说明该城市没有结界保护,保证l1l1=0 。

输出格式

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

样例
输入样例

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

输出样例

5

数据范围与提示

对于 20%的数据,满足N≤15,M≤50;
对于 50%的数据,满足N≤500,M≤6,000;
对于 100%的数据,满足N≤3,000,M≤70,000,1≤wi​≤10^8
输入数据保证一定有解,且不会存在维持某个城市结界的结界发生器在这个城市内部。连接两个城市的道路可能不止一条, 也可能存在一个城市自己到自己的道路。

这道题是一道dijkstra的题目,只不过要做略微变形。用t1代表到达城市的最短时间,t2代表摧毁保护城市的所有结界发生器的最短时间,摧毁城市的最短时间即 MAX(t1,t2) 。

每次用 dis[x] 更新 t1[x可以到的点],再更新保护 x可以到的点的结界发生器数量即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
//快读
int read(){
int ret=;
char ch=getchar();
while(ch<'' || ch>''){
ch=getchar();
}while(ch>='' && ch<=''){
ret=(ret<<)+(ret<<)+ch-'';
ch=getchar();
}return ret;
}
struct dat{
int p,d;
};
vector <dat> v[];
vector <int> h[];
int t1[],t2[],dis[],cnt[];
//t1[i]代表到达城市i的最短时间 t2[i]代表摧毁保护城市i的所有结界发生器的最短时间 dis[i]代表摧毁城市i的最短时间
bool vis[];
priority_queue <pair<int,int> > q;//优先队列
//迪杰斯特拉
void dj(){
t1[]=;
dis[]=;
q.push(make_pair(,));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x]){
continue;
}vis[x]=;
for(int i=; i<v[x].size(); i++){
if(!vis[v[x][i].p]){
int y=v[x][i].p;
int z=v[x][i].d;
if(t1[y]>dis[x]+z){
t1[y]=dis[x]+z;
if(!cnt[y]){
dis[y]=max(t1[y],t2[y]);
q.push(make_pair(-dis[y],y));
//优先队列默认大根堆,所以要取反
}
}
}
}for(int i=; i<h[x].size(); i++){
int y=h[x][i];
if(cnt[y]){
cnt[y]--;
t2[y]=max(dis[x],t2[y]);
if(!cnt[y]){
dis[y]=max(t1[y],t2[y]);
q.push(make_pair(-dis[y],y));
}
}
}
}
}
int main(){
//freopen("t4.in","r",stdin);
//freopen("d.out","w",stdout);
int n,m,x,y,z,tmp=;
dat u;
n=read();
m=read();
for(int i=; i<=m; i++){
x=read();
y=read();
z=read();
u.d=z;
u.p=y;
v[x].push_back(u);
}for(int i=; i<=n; i++){
x=read();
cnt[i]=x;
for(int j=; j<=x; j++){
y=read();
h[y].push_back(i);
}
}memset(t1,inf,sizeof(t1));
memset(dis,inf,sizeof(dis));
dj();
printf("%d",dis[n]);
return ;
}

SDOI2010_大陆争霸(邻接表存图)的更多相关文章

  1. QDUOJ 生化危机 邻接表存图+BFS

    生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败 ...

  2. 三种邻接表存图模板:vector邻接表、数组邻接表、链式前向星

    vector邻接表: ; struct Edge{ int u,v,w; Edge(int _u=0,int _v=0,int _w=0){u=_u,v=_v,w=_w;} }; vector< ...

  3. PTA 邻接表存储图的广度优先遍历(20 分)

    6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ...

  4. hdu 2647 (拓扑排序 邻接表建图的模板) Reward

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...

  5. PTA 邻接表存储图的广度优先遍历

    试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...

  6. c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)

    一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...

  7. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  8. 邻接表存储图,DFS遍历图的java代码实现

    import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...

  9. 数据结构C++使用邻接表实现图

    定义邻接表存储的图类.[实验要求] (1)创建一个邻接表存储的图:(2)返回图中指定边的权值:(3)插入操作:向图中插入一个顶点,插入一条边:(4)删除操作:从图中删除一个顶点,删除一条边:(5)图的 ...

随机推荐

  1. linux 安装nginx(转)

    转自https://www.cnblogs.com/xiaochongc/p/11527492.html 步骤: 1. 安装所需环境 a)安装gcc:安装 nginx 需要先将官网下载的源码进行编译, ...

  2. A·F·O小记

    看过很多的游记,也看过很多的退役记.回忆录,而当自己真正去面对的那一刻,却又不知道从何说起,也不知道能用怎样的形式和语言,才能把这段珍贵的记忆封存起来,留作青春里的一颗璀璨明珠…… 还是随便写写吧…… ...

  3. 【代码】python 绘图(以faster rcnn 的 loss 曲线为例)

    # -*- coding=utf-8 -*-''' import matplotlib.pyplot as plt import re logs=open('loss').read() #print ...

  4. Linux 安装软件报错 Sub-process /usr/bin/dpkg returned an error code (1)

    Linux 通过 apt-get 安装软件时报错,换一个软件安装也一样. Errors were encountered while processing: blueman E: Sub-proces ...

  5. Alpha项目冲刺! Day1-领航

    各个成员在 Alpha 阶段认领的任务 成员 任务 任务时长 林恩 项目进度签到代码审核与签入撰写博客协调组内合作 50 寇永明 美工和部分后台编写 30 杨长元 安卓端搭建 45 胡彤 服务器框架搭 ...

  6. oracle主键修改级联外键

    举例:修改te_rygj_menu这张表的主键menu_id时,te_rygj_usermenu中的menu_id也跟着修改.利用触发器trigger实现: create or replace tri ...

  7. 解决问题:OSError: mysql_config not found

    通过pip install mysqlclient时报出了OSError: mysql_config not found错误,如下 Traceback (most recent call last): ...

  8. JMeter中计数器的使用

    添加计数器 计数器的引用,用于数据做区分 可以添加一个变量count,每次为了数据的唯一性,只要修改count就可以了,例如

  9. OpenJudge计算概论-年龄与疾病

    /*========================================================== 年龄与疾病 总时间限制: 1000ms 内存限制: 65536kB 描述 某医 ...

  10. CV3——学习笔记-实战项目(上):如何搭建和训练一个深度学习网络

    http://www.mooc.ai/course/353/learn?lessonid=2289&groupId=0#lesson/2289 1.AlexNet, VGGNet, Googl ...