https://www.luogu.org/problem/P1462

感觉,要二分最大收费权的城市,把小于等于它的全部插进去,Dijkstra一下求出最小的血量。这样感觉太暴力了。

考虑只有10000个城市,sort一下,每条无向边都由排名靠后的城市插入。按收费顺序插入城市,直到并查集中1和n连通,来一次Dijkstra求出所需的血量。

假如所需血量已经>=b,说明不合法。

这个时候插入下一个城市及其连通的边,考虑会发生什么改变?首先到达这个城市的最短距离必定是从连出城市走对应路径过来的。

其次它可能会对整个图进行一次更新。所以这个复杂度也是惊人。

所以还是二分城市,要log1e5=15,插入对应的边5e4,跑一次Dijkstra要5e4log5e4=8e5,小得很。


想着至少要过一半吧,没想到一发就全AC了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int MAXN = 1e4 + 5, INF = 0x3f3f3f3f; struct Edge {
int v, w;
Edge() {}
Edge(int v, int w): v(v), w(w) {}
};
bool vis[MAXN];
int dis[MAXN];
vector<Edge> G[MAXN]; int fa[MAXN];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
} void merge(int x, int y) {
int fx = find(x), fy = find(y);
fa[fy] = fx;
} struct City {
int id, f;
bool operator<(const City &c)const {
return f < c.f;
}
} city[MAXN]; int n, b; void Init() {
for(int i = 0; i <= n; ++i)
fa[i] = i;
memset(vis, 1, sizeof(vis[0]) * (n + 1));
memset(dis, INF, sizeof(dis[0]) * (n + 1));
} void AddCity(int Ceil) {
for(int i = 1; i <= Ceil; ++i) {
int u = city[i].id;
vis[u] = 0;
for(auto ei : G[u])
merge(u, ei.v);
}
} priority_queue<pair<int, int> > pq;
int Dijkstra(int s) {
pq.push({0, 1});
dis[1] = 0;
while(!pq.empty()) {
int u = pq.top().second;
pq.pop();
if(vis[u])
continue;
vis[u] = 1;
for(auto ei : G[u]) {
int v = ei.v, w = ei.w;
if(!vis[v] && dis[u] + w < dis[v]) {
dis[v] = dis[u] + w;
pq.push({-dis[v], v});
}
}
}
return dis[n];
} bool check(int Ceil) {
Init();
AddCity(Ceil);
if(find(1) != find(n))
return false;
int res = Dijkstra(1);
return res < b;
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int m;
scanf("%d%d%d", &n, &m, &b);
for(int i = 1; i <= n; ++i) {
scanf("%d", &city[i].f);
city[i].id = i;
}
sort(city + 1, city + 1 + n);
for(int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G[u].emplace_back(Edge(v, w));
G[v].emplace_back(Edge(u, w));
}
int L = 1, R = n, M;
while(1) {
M = L + R >> 1;
if(L == M) {
if(check(L)) {
printf("%d\n", city[L].f);
return 0;
} else if(check(R)) {
printf("%d\n", city[R].f);
return 0;
}
puts("AFK");
return 0;
}
if(check(M))
R = M;
else
L = M + 1;
}
}

洛谷 - P1462 - 通往奥格瑞玛的道路 - 二分 - Dijkstra的更多相关文章

  1. 洛谷P1462 通往奥格瑞玛的道路[二分答案 spfa 离散化]

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  2. 洛谷P1462通往奥格瑞玛的道路——二分答案最短路

    题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include ...

  3. 洛谷 P1462 通往奥格瑞玛的道路——二分+spfa

    上一波链接 https://www.luogu.org/problem/P1462 这道题我们考虑二分答案 然后每次跑一次spfa判断是否能够到达n点 tips:在不考虑负权边的前提下我们写最短路最好 ...

  4. 洛谷 P1462 通往奥格瑞玛的道路 二分 最短路

    #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using ...

  5. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  6. 洛谷 P1462 通往奥格瑞玛的道路 题解

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  7. 洛谷 P1462 通往奥格瑞玛的道路 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  8. 洛谷——P1462 通往奥格瑞玛的道路

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  9. 洛谷 P1462 通往奥格瑞玛的道路

    洛谷 题意:要求在限定油耗内,求最小花费的最大值. 求最小值最大很容易想到二分答案.所以我们往二分的方向去想. 我们二分一个费用,然后要保证到终点时满足限定油耗,所以跑最短路. 不过松弛条件要改一下: ...

随机推荐

  1. 12.python csv文件写入和读出

    import csv headers = ["class", "name", "sex", "height", &quo ...

  2. 30 分钟理解 CORB 是什么

    写在前面 前些日子在调试 bug 的时候,偶然发现这么一个警告: Cross-Origin Read Blocking (CORB) blocked cross-origin response htt ...

  3. HDU 1394 Minimum Inversion Number (树状数组 && 规律 && 逆序数)

    题意 : 有一个n个数的数列且元素都是0~n-1,问你将数列的其中某一个数及其前面的数全部置到后面这种操作中(比如3 2 1 0中选择第二个数倒置就产生1 0 3 2)能产生的最少的逆序数对是多少? ...

  4. smarty笔记

    smarty 笔记display():把html包含进来然后用正则匹配php变量把匹配好的页面重新保存inclue载入刚才的保存的页面 1.smarty原理2.smarty安装3.smarty模板设计 ...

  5. mac卸载jdk

    在本地gradle打包后,将war包部署到服务器,tomcat的localhost日志报这个错: 严重: Error configuring application listener of class ...

  6. webpack 自动运行,及打包 img css json 的操作 npm插件的使用方法

    没有指令操作的属性生产环境,有指令操作的属于开发环境 webpack:输入指令后,便会自动开启一个浏览器 需要插件:open-browser-webpack-plugin 生产环境 想使用 node. ...

  7. 用JS实现快速排序

    "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...

  8. js获取Session问题

    纯htm页面必须采用AJAX了,ASP页面:var manager='<%=session("manager")%>', ASPX页面:var manager='< ...

  9. Mysql基本管理知识

    数据库的启动 [root@node80 ~]# /etc/init.d/mysqld start #mysqld是从安装包拷贝的mysql.server Starting MySQL. SUCCESS ...

  10. Jvm组成以及调优

    Jvm的内存由三部分组成Eden,S0,S1,Old以及Metaspace(JDK1.8之前的Perm区)五部分组成: (图片摘自VisualVM的Visual GC插件) 抽象为三代:新生代(Ede ...