题解 [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.你只需摧毁位于杰森国首都 的曾·布拉泽大神殿,杰森国的信仰,军队还有一切就都会 ...
随机推荐
- ORACLE查询进程,并杀死
用于存放常用SQL --查询主键在哪一列 --设置页大小 --设置行大小 col COLUMN_NAME for a20 --设置字段显示长度 col TABLE_NAME for a20 col O ...
- 【AtCoder】ARC061
ARC061 C - たくさんの数式 / Many Formulas 这个其实\(10^5\)也能做.. 就是\(dp[i]\)表示到第i位的方案数,\(sum[i]\)表示延伸到第i位之前的所有方案 ...
- 【LOJ】#3101. 「JSOI2019」精准预测
LOJ#3101. 「JSOI2019」精准预测 设0是生,1是死,按2-sat连边那么第一种情况是\((t,x,1) \rightarrow (t + 1,y,1)\),\((t + 1,y, 0) ...
- QT QcustomPlot的使用(二)
在QcustomPlot中,给横纵坐标添加箭头的方法 //在末尾添加箭头 customPlot->xAxis->setUpperEnding(QCPLineEnding::esSpikeA ...
- Laravel三种中间件的作用
$middleware 属性: 这个属性称为全局中间件,为什么说是全局中间件呢?因为你的每一次请求,这里面的每个中间件都会执行. $routeMiddleware 属性: 这个属性称为路由中间件,为什 ...
- k8s-traefik默认80端口
vim traefik.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-con ...
- 安装HAXM报错:failed to configure driver unknown error. failed to open driver 并提示数字签证不可用
1.安装微软补丁:https://www.microsoft.com/en-us/download/confirmation.aspx?id=46148 2.重启后重新安装HAXM
- select input 等控件进行清空操作
<html> <head> <meta charset="utf-8" /> <title></title> <s ...
- css样式背景图片设置缩放
一.背景颜色图片平铺 background-color 背景颜色 background-image 背景图片地址 background-repeat 是否平铺 默认是平铺 background-pos ...
- C++ STL 之 set 和 pair
set/multiset 的特性是所有元素会根据元素的值自动进行排序.set 是以 RB-tree(红黑树,平衡二叉树的一种)为底层机制,其查找效率非常好.set 容器中不允许重复元 素,multis ...