题解 [SDOI2010] 大陆争霸
解析
这题似乎不是那么难啊
首先,显而易见,
如果要摧毁一个城市,必须要满足两个条件:
- 机器人摧毁了保护它的城市.
- 机器人到达了这个城市.
而这两个条件可以同时进行(毕竟有无数机器人)
那么显然,我们只需要在上面的条件的时间取\(max\)就行了.
具体来说,我们可以魔改dijkstra,
设\(d1[i]\)是到达\(i\)的时间,\(d2[i]\)是摧毁保护\(i\)的所有城市的时间,
对于保护\(j\)的城市\(i\),从\(i\)到\(j\)连边(新建一张图),就可以更新\(d2\)了.
只要城市被摧毁,就将它放到堆里面就行了.
具体看代码吧:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;
inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
}
const int N=100001;
struct edge{int to,next,w;}e[N<<1],E[N<<1];
int n,m;
int head[N],Head[N],cnt,Cnt;
int d1[N],d2[N],s[N],v[N];
priority_queue < pair<int,int> > que;
inline void add(int x,int y,int w){
e[++cnt]=(edge){head[x],y,w};head[x]=cnt;
}
inline void Add(int x,int y,int w){
E[++Cnt]=(edge){Head[x],y,w};Head[x]=Cnt;
}
inline void dij(){
memset(d1,0x3f,sizeof(d1));d1[1]=0;
que.push(make_pair(0,1));
while(!que.empty()){
int x=que.top().second,d=-que.top().first;que.pop();
if(max(d1[x],d2[x])!=d) continue;
if(v[x]) continue;v[x]=1;
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(d1[k]<=d+e[i].w) continue;
d1[k]=d+e[i].w;
if(!s[k]) que.push(make_pair(-max(d1[k],d2[k]),k));
}
for(int i=Head[x];i;i=E[i].to){
int k=E[i].next;
s[k]--;d2[k]=max(d2[k],d);
if(!s[k]) que.push(make_pair(-max(d1[k],d2[k]),k));
}
}
// for(int i=1;i<=n;i++) printf("d1[%d]=%d d2[%d]=%d\n",i,d1[i],i,d2[i]);
}
int main(){
n=read();m=read();
for(int i=1;i<=m;i++){int x=read(),y=read(),w=read();add(x,y,w);}
for(int i=1;i<=n;i++){
s[i]=read();
for(int j=1;j<=s[i];j++){int x=read();Add(x,i,0);}
}
dij();
printf("%d\n",max(d1[n],d2[n]));
return 0;
}
题解 [SDOI2010] 大陆争霸的更多相关文章
- 洛谷 P2446 [SDOI2010]大陆争霸 解题报告
P2446 [SDOI2010]大陆争霸 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭的神曾·布拉 ...
- AC日记——[SDOI2010]大陆争霸 洛谷 P3690
[SDOI2010]大陆争霸 思路: dijkstra模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn ...
- bzoj1922 [SDOI2010]大陆争霸 分层图
问题描述 幻想历8012年5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增.作为克里斯军团的主帅,你决定利用这一机会发动奇袭,一举 ...
- BZOJ1922 [Sdoi2010]大陆争霸 【最短路】
题目 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林 ...
- BZOJ1922 [Sdoi2010]大陆争霸
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- bzoj 1922 [Sdoi2010]大陆争霸(最短路变形)
Description 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光 ...
- BZOJ1922:[SDOI2010]大陆争霸(最短路)
Description 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光 ...
- Dijkstra【P2446】 [SDOI2010]大陆争霸
Background 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭的神曾·布拉泽,而克里斯国信仰象征光明和永 ...
- 【BZOJ1922】[Sdoi2010]大陆争霸 Dijkstra
Description 具体地说,杰森国有 N 个城市,由 M条单向道 路连接.神谕镇是城市 1而杰森国的首都是城市 N.你只需摧毁位于杰森国首都 的曾·布拉泽大神殿,杰森国的信仰,军队还有一切就都会 ...
随机推荐
- libtool
[从网上摘录的,忘了从哪摘的了] libtool常见于autoconf/automake,单独用的例子很少,所以我想仔细研究一下,为将来兄弟们看起来方便. 一.libtool的作用offer a ...
- jdk1.8 -- Collectors 的使用
package com.collector; import java.util.ArrayList; import java.util.Arrays; import java.util.Collect ...
- 【转帖】sysbench压力测试工具简介
sysbench压力测试工具简介 https://www.cnblogs.com/pdlife/p/6698957.html 一.sysbench压力测试工具简介: sysbench是一个开源的.模块 ...
- postgresSQL常用命令
1.createdb 数据库名称 产生数据库2.dropdb 数据库名称 删除数据库 3.CREATE USER 用户名称 创建用户4.drop User 用户名称 删除用户 5.SELEC ...
- SpringBoot 使用WebSocket打造在线聊天室
教程: https://www.jianshu.com/p/55cfc9fcb69e https://wallimn.iteye.com/blog/2425666 关于websocket基础普及见:h ...
- orcale数据库授权码
Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca
- MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的
MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写.事物A 原子性C 一致性I 隔离性D 持久性高并发的场景下的问题脏读不可重复读幻读事物隔离级别RU读未提交 脏读/不可重复读/幻读 .不适用 ...
- [DEBUG] spring boot在eclipse中用maven打包成jar访问templates报500错误
更新:打war包的话只要把html文件放在resources/templates下即可,根本不需要放外面. 配置application.yml和templates放外面这种做法,打war包确实不行. ...
- Python 常用外部模块详解
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- Java String类源码
String类的签名(JDK 8): public final class String implements java.io.Serializable, Comparable<String&g ...