题意:给定一个图,图中有保护关系(u,v)表示到v之前必须先到一次u,求从1到N的最短路

题解:

定义d1[i]为直接到达i的最短距离,这个的更新和普通的Dijkstra一样

定义d2[i]为解除i的所有保护的最短距离(不一定要在i结束),这个更新起来很简单,每经过一个节点就将其所控制的城市的发生器数全部--,没有发生器的城市直接用当前的距离更新即可。

最后答案显然就是max(d1[N],d2[N])

#include <queue>
#include <vector>
#include <functional>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;const int MAXN=3000+2;
const int MAXM=70000+2;
struct HASH{int u,w;HASH *next;HASH(){}HASH(int _u,int _w,HASH *_next):u(_u),w(_w),next(_next){}
}*table[MAXN],mem[2*MAXM];
struct NODE{int u,w;NODE(){}NODE(int _u,int _w):u(_u),w(_w){};friend bool operator<(NODE a,NODE b){ return a.w>b.w;}
};
int N,M,t[MAXN],d1[MAXN],d2[MAXN],cnt;
bool flag[MAXN];
vector<int> pro[MAXN];
priority_queue<NODE> q;void Insert(int u,int v,int w){ table[u]=&(mem[cnt++]=HASH(v,w,table[u]));}int Dijkstra(int s,int e){memset(d1,0X7F,sizeof(d1));d1[s]=0,q.push(NODE(s,0));int x;while(!q.empty()){x=q.top().u,q.pop();if(flag[x]) continue;flag[x]=1;int dist=max(d1[x],d2[x]);for(HASH *p=table[x];p;p=p->next)if(d1[p->u]>dist+p->w){d1[p->u]=dist+p->w;if(!t[p->u]) q.push(NODE(p->u,max(d1[p->u],d2[p->u])));}for(int i=0;i<pro[x].size();i++){t[pro[x][i]]--;d2[pro[x][i]]=max(d2[pro[x][i]],dist);if(!t[pro[x][i]]) q.push(NODE(pro[x][i],max(d1[pro[x][i]],d2[pro[x][i]])));}}return max(d1[e],d2[e]);
}int main(){cin >> N >> M;for(int i=1,u,v,w;i<=M;i++){cin >> u >> v >> w;Insert(u,v,w);}for(int i=1;i<=N;i++){cin >> t[i];for(int j=1,k;j<=t[i];j++){cin >> k;pro[k].push_back(i);}}cout << Dijkstra(1,N) << endl;return 0;
}

View Code

转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6476802.html

BZOJ1922 SDOI2010 大陆争霸 最短路相关推荐

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

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

  2. BZOJ1922: [Sdoi2010]大陆争霸

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

  3. P2446 [SDOI2010]大陆争霸

    P2446 [SDOI2010]大陆争霸 题意: n个点,m个边,wi为每个边的边权,对于每个点i,其被l个点保护着,也就是如果保护其的点没有被破坏,点i无法被破坏(也无法经过其前往其他点).现在从1 ...

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

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

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

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

  6. [BZOJ1922]大陆争霸-最短路略微扩展

    说在前面 写代码不够专注,然后某个2B的地方敲错了-.查错半小时才过样例=A= 题目 BZOJ1922传送门 题意 (能力不足,实在是把这个题意概括不下来-放弃了) 解法 其实仔细想想就知道,只是在最 ...

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

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

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

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

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

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

最新文章

  1. 获取本地的IP地址(内网)
  2. 文巾解题 面试题 01.04. 回文排列
  3. C语言20790内所有因子的和,长春市水污染控制指标的因子和聚类分析.pdf
  4. Android USB Host与HID通讯(二)
  5. 使用Java泛型的模板方法模式示例
  6. python 抓取网页链接_从Python中的网页抓取链接
  7. Diango博客--9.归档、分类和标签页
  8. 正则表达式简单语法及常用正则表达式
  9. Oracle查看表空间,创建表空间
  10. 异星工厂机器人科技树_异星工场(Factorio)玩法分析与讨论
  11. qt 界面控件布局
  12. Android动画之补间动画详解
  13. springboot+vue+Elementui宠物医院管理系统java项目
  14. 高德地图提示com.autonavi.amap.mapcore.MapCore.nativeNewInstance问题
  15. 智在未来,明年再聚--OFweek2018(第三届)中国高科技产业大会完美闭幕!
  16. 如何添加二级域名(图文超级详细)
  17. 如火般的风马: 快速迁移本地项目到Bluemix云平台
  18. 2021最新Spring Security知识梳理
  19. CTF简单的文件修复
  20. 聆听喳倩老师诵读「红楼梦赏析」号首发沙木木君,于二零一九年七月七日编创的新博文

热门文章

  1. 你必须很努力,才能看上去毫不费力
  2. java.net.SocketException: Permission denied解决
  3. 对Xml文档进行操作(修改,删除)
  4. CSS3笔记之定位篇(二)z-index
  5. mybatis的Example[Criteria]的使用
  6. ES5-1 发展史、ECMA、编程语言、变量、JS值
  7. Linux学习-11月12日(Apache安装)
  8. 理解git结构与简单操作(四)合并分支的方法与策略
  9. Oracle 变量绑定与变量窥视合集系列一
  10. percona-toolkit工具包安装