P2446 [SDOI2010]大陆争霸

题意:

n个点,m个边,wi为每个边的边权,对于每个点i,其被l个点保护着,也就是如果保护其的点没有被破坏,点i无法被破坏(也无法经过其前往其他点)。现在从1出兵(无限数量),问破坏点n的最短时间

题解:

很明显这个题跟最短路有关,对于每个点,有这几种状态:是否保护,是否已经到达
因为如果我们跑最短路,跑出来的结果并不是,因为有些点受保护的情况,实际到达时间要被推迟(直到保护他的点也被破坏)
我们用now[u]表示点u被破坏的时间,arrive[u]表示u无人保护的时刻(如果一开始就无人保护,默认值为0),dis[u]表示路径上到达u的时间
对于now[u]应该取dis[u]和arrive[u]的最大值,因为u被破坏需要可达(不被保护)且已经到达(路径距离)
dis[u]最短路维护,arrive[u]怎么维护呢?
arrive[u]记录的其实是保护u的点x,x被破坏的最大值。所以如果u被x保护,我们就从x到u建一个边(无向边),在跑最短路过程中,不断更新arrive[u],arrive[u]=max(now[x])
详细可以见代码

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); //计时开始freopen("landcraft.in","r",stdin);#endif
}
void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); //计时结束printf("\n运行时间为:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif
}
const int maxn=1e6+9;
struct Edge
{int u,v,w,next;
}e[maxn];
int head[maxn],cnt,n,m,s,vis[maxn],dis[maxn],pre[maxn];
int ind[maxn],arrive[maxn],now[maxn];
struct node
{int w,now;inline bool operator <(const node &x)const//重载运算符把最小的元素放在堆顶(大根堆){return w>x.w;//这里注意符号要为'>'}
};
priority_queue<node>q;
inline void add(int u,int v,int w)
{e[++cnt].u=u;//这句话对于此题不需要,但在缩点之类的问题还是有用的e[cnt].v=v;e[cnt].w=w;e[cnt].next=head[u];//存储该点的下一条边head[u]=cnt;//更新目前该点的最后一条边(就是这一条边)
}
vector<int>vec[maxn];
void dijkstra()
{for(int i=1;i<=n;i++){dis[i]=INF_int;arrive[i]=0;}dis[s]=arrive[s]=0;//赋初值q.push((node){0,s});int u,v;while(!q.empty())//堆为空即为所有点都更新{node x=q.top();q.pop();u=x.now;//记录堆顶(堆内最小的边)并将其弹出if(vis[u]) continue; //没有遍历过才需要遍历vis[u]=1;now[u]=max(dis[u],arrive[u]);//到达u的时间时间 for(int i=head[u];i;i=e[i].next)//更新所有dis[v] {v=e[i].v;if(dis[v]>now[u]+e[i].w){dis[v]=now[u]+e[i].w;if(!ind[v]){//如果这个点没有被保护 pre[v]=u;//松弛操作now[v]=max(dis[v],arrive[v]);q.push((node){max(dis[v],arrive[v]),v});//把新遍历到的点加入堆中}}}//开始摧毁点u for(int i=0;i<vec[u].size();i++){v=vec[u][i];ind[v]--;arrive[v]=max(arrive[v],now[u]);if(!ind[v]){now[v]=max(dis[v],arrive[v]);q.push((node){now[v],v}); }}}
}int main()
{rd_test();cin>>n>>m;s=1; for(int i=1;i<=m;i++){int x,y,z;x=read(),y=read(),z=read();add(x,y,z);}for(int i=1;i<=n;i++){int l=read();if(l==0)continue;for(int j=1;j<=l;j++){int x=read(); ++ind[i];vec[x].push_back(i);//vec[i].push_back(x);//add(x,i,0);}}dijkstra();cout<<now[n];//Time_test();
}

P2446 [SDOI2010]大陆争霸相关推荐

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

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

  2. [Bzoj 1922] [SDOI2010] 大陆争霸

    1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2274  Solved: 1025 [Submit][Sta ...

  3. B1922 [Sdoi2010]大陆争霸 最短路

    我一直都不会dij的堆优化,今天搞了一下...就是先弄一个优先队列,存每个点的数据,然后这个题就加了一点不一样的东西,每次的最短路算两次,一次是自己的最短路,另一次是机关的最短路,两者取最大值才是该点 ...

  4. BZOJ 1922: [Sdoi2010]大陆争霸

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

  5. BZOJ1922: [Sdoi2010]大陆争霸

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1922 带限制最短路. 每个点真正的dis是max(dis[i],dis[v]),v是其保护点. ...

  6. BZOJ1922 SDOI2010 大陆争霸 最短路

    题意:给定一个图,图中有保护关系(u,v)表示到v之前必须先到一次u,求从1到N的最短路 题解: 定义d1[i]为直接到达i的最短距离,这个的更新和普通的Dijkstra一样 定义d2[i]为解除i的 ...

  7. BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)

    1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1154 Solved: 478 [Submit][Status ...

  8. 【BZOJ1922】【Tyvj1736】【codevs2129】大陆争霸,无语最短路

    传送门1 传送门2 传送门3 写在前面:之前写的,忘保存了,只能重来= = 思路:DaD3zZ推荐的可做的图论,却耗了我好久--毕竟我太弱了,这个最短路问题要求一些点走的要有顺序,我的第一反应是拓扑排 ...

  9. 2017.10.19 大陆争霸 思考记录

    一上来想到拓扑分层最短路,但需要多源最短路.. 这题考查的是对dij的理解 dij只能跑最短路每次都找极值点进行一次拓展,同时不能有负边权 所以一次需要确定  两个值都确定的一个点所以扩展的条件有两个 ...

最新文章

  1. Pycharm基本操作
  2. matlab intergral,matlab學習:人臉識別之HOG(Histograms of Oriented Gradients)
  3. VTK:多图用法实战
  4. Java并发编程实战_真香!阿里P8耗时半年著作660页Java高并发与网络编程实战总结...
  5. java数组图片_在JAVA中定义图片数组
  6. 比较下OceanBase的选举协议和Raft的选举协议的区别
  7. keil流水灯c语言程序两个一起亮,Keil单片机点亮一个灯及循环流水灯三种实现方法详解...
  8. SVN使用方法及问题解决
  9. 北大先修课 计算机,解读:北大清华大学先修课的那些事
  10. android手机上传不了图片,【报Bug】nvue页面使用web-view组件,安卓手机无法调用页面的input标签上传图片...
  11. 和我一起学《HTTP权威指南》——Web服务器
  12. Japanese的意思
  13. 搭建内网BT服务器(转)
  14. Linux (deepin)网络管理详解.
  15. 金字塔结构式表达利器
  16. 二、使用Stream流的方式完成过滤操作
  17. openwrt控制天翼网关定时重启
  18. HTC Desire获取ROOT方法--HTC Desire rooting guide (now with new improved / easier root method!)
  19. shiroFilter生命周期
  20. 解决安装import nonebot后报错importError问题

热门文章

  1. 普通人和程序员看到的树
  2. 近期资料分享汇总,还不快来看看你漏了哪份没拿?
  3. 如何用Python画一个中国地图?
  4. 在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...
  5. linux图形界面鼠标变成小手_加载Linux系统,树莓派变身桌面电脑
  6. 京瓷1020怎么打印自检页_[建筑]喷墨打印机如何打印自检页 详细
  7. 临界表储存图的数据(思路+详解+图示)
  8. 高度平衡的二叉搜索树基础概念与经典题目(Leetcode题解-Python语言)
  9. [Spring5]Spring框架概述
  10. 三年级计算机群鸭戏水教案导入,三年级下册信息技术教案-3.7群鸭戏水-插入自选图形|清华版.doc...