【BZOJ1922】[Sdoi2010]大陆争霸 Dijkstra
Description
Input
Output
Sample Input
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
Sample Output
HINT
对于 20%的数据,满足 N≤15,M≤50;
对于 50%的数据,满足 N≤500,M≤6,000;
对于 100%的数据,满足 N≤3,000,M≤70,000,1≤wi≤108。
输入数据保证一定有解,且不会存在维持某个城市结界的结界发生器在这个城市内部。
连接两个城市的道路可能不止一条, 也可能存在一个城市自己到自己的道路。
题解:显然这是满足Dijsktra的贪心条件的。
用f[i]表示机器人到达点i的最短时间,用g[i]表示摧毁i的所有结界发生器的最短时间,那么在跑最短路时,用max(f[i],g[i])来更新它所有出边的f值,以及它所有保护的点的g值,如果一个点的所有结界发生器都被摧毁,则将其压入队列。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#define mp(A,B) make_pair(A,B)
using namespace std;
const int maxn=3010;
typedef long long ll;
int n,m,cnt;
vector<int> v[maxn];
int vis[maxn],rly[maxn],to[70010],next[70010],head[maxn];
ll d1[maxn],d2[maxn],val[70010];
priority_queue<pair<ll,int> > q;
inline void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,a,b,c,u;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++) a=rd(),b=rd(),c=rd(),add(a,b,c);
memset(d1,0x3f,sizeof(d1));
for(i=1;i<=n;i++)
{
a=rly[i]=rd();
while(a--) b=rd(),v[b].push_back(i);
}
d1[1]=d2[1]=0,q.push(mp(0,1));
while(!q.empty())
{
u=q.top().second,q.pop();
if(vis[u]) continue;
vis[u]=1,d1[u]=max(d1[u],d2[u]);
if(u==n)
{
printf("%lld",d1[u]);
return 0;
}
for(i=head[u];i!=-1;i=next[i]) if(d1[to[i]]>d1[u]+val[i])
{
d1[to[i]]=d1[u]+val[i];
if(!rly[to[i]]) q.push(mp(-max(d1[to[i]],d2[to[i]]),to[i]));
}
for(i=0;i<(int)v[u].size();i++)
{
d2[v[u][i]]=max(d2[v[u][i]],d1[u]),rly[v[u][i]]--;
if(!rly[v[u][i]]) q.push(mp(-max(d1[v[u][i]],d2[v[u][i]]),v[u][i]));
}
}
return 0;
}
【BZOJ1922】[Sdoi2010]大陆争霸 Dijkstra的更多相关文章
- bzoj1922 [SDOI2010]大陆争霸 分层图
问题描述 幻想历8012年5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增.作为克里斯军团的主帅,你决定利用这一机会发动奇袭,一举 ...
- BZOJ1922 [Sdoi2010]大陆争霸
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ1922:[SDOI2010]大陆争霸(最短路)
Description 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光 ...
- BZOJ1922 [Sdoi2010]大陆争霸 【最短路】
题目 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光明和永恒的神斯普林 ...
- BZOJ 1922: [Sdoi2010]大陆争霸 Dijkstra
Code: #include <queue> #include <vector> #include <cstdio> #include <cstring> ...
- 【BZOJ1922】大陆争霸(最短路)
[BZOJ1922]大陆争霸(最短路) 题面 BZOJ 洛谷 题解 最短路变形题. 定义\(dis\)表示最短路,\(d\)表示最早可以进入当前点的时间.显然\(d=max(max(dis_v,d_v ...
- 洛谷 P2446 [SDOI2010]大陆争霸 解题报告
P2446 [SDOI2010]大陆争霸 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭的神曾·布拉 ...
- AC日记——[SDOI2010]大陆争霸 洛谷 P3690
[SDOI2010]大陆争霸 思路: dijkstra模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn ...
- 【bzoj1922】[Sdoi2010]大陆争霸 堆优化Dijkstra
题目描述 一张n个点m条边的图,通过每条边需要一定的时间.有一些限制条件,每个限制条件形如“x保护y”,表示到达y的最短时间不能小于到达x的最短时间(即如果在其之前到达,则需要等待至xd到达).问1到 ...
随机推荐
- 【转帖】Servlet 3.0 新特性详解
http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 ...
- JBoss目录结构说明
http://www.blogjava.net/livery/articles/262544.html $JBOSS-HOME/bin: 放置各种脚本文件以及相关文件,包括jb ...
- 网页中font-family的属性解析
web中文字体的选择 web应用程序因其跨平台性被广泛应用,但是也为web应用程序运行带来了复杂的运行环境,比如各个系统字体的区别以及中英文字体显示的区别. 字体分类 网页常用字体通常分为5类:ser ...
- 关于Xcode正确运行swift多线程
想跳过废话直接看解决方案的可以点击这里直接跳转,我这人写博客喜欢瞎逼逼. 还有一些我看过的不错的多线程资料,在此给出链接,点击这里直接跳转查看. 近来为了做操作系统课程设计,不得不去学习了下多线程. ...
- Request to https://bower.herokuapp.com failed with 502
bower 版本过低,需要升级为最新bower版本, 如果升级版本后依然无法使用,更改.bowerrc配置,如下所示 { "directory": "bower_comp ...
- Chrome应用技巧之颜色拾取
之前在Chrome应用店找了个插件实现拾色功能.并且很不理想.不知道是不是曾经Chrome自带的开发工具没提供到拾色功能还是我没发现.今天无意中发现Chomer自带的开发工具可拾色,请看以下的GIF动 ...
- windows server 2003中端口默认不能使用问题
问题:在windows server 2003中IIS6.0新建站点,给了一个新端口(非80),然后配置好后不能访问 解决方案:系统内置防火墙需要添加对应端口,如下图: 即解决.
- asp.net mvc5 配置自定义路径
首先配置路由文件,默认页是第一个路由的配置: using System; using System.Collections.Generic; using System.Linq; using Syst ...
- 天猫 小游戏 24 point
游戏规则:给你四个整数,当然他给的是有解的,然后用' + - * / ( ) ,这几种符号任意组合,使运算结果等于24; 用代码快速解决问题,呵呵... #include<io ...
- win7系统如何配置JAVA环境变量
1.在“计算机”右击选择“属性” 2.点击“高级系统设置” 3.点击“环境变量” 4.点击系统变量下面的“新建” (1)新建->变量名:JAVA_HOME变量值 C:\Program Files ...