[CSU 2005 Nearest Maintenance Point Submit Page] Dijkstra
来源:互联网 发布:java简明教程 编辑:程序博客网 时间:2024/06/06 14:16
[CSU 2005 Nearest Maintenance Point Submit Page] Dijkstra
分类:Data Structure
Shortest Path
Dijkstra
1. 题目链接
[CSU 2005 Nearest Maintenance Point Submit Page]
2. 题意描述
有一个
如果有多个加油站,按照节点编号从小到大输出。
数据范围:
3. 解题思路
真的是一个很水的最短路。省赛上一眼就看出来思路了。但是当时没有想到用bitset来记忆化,我用的set,MLE有尝试缩短链的长度。导致全场都没有调出来,gg...
将所有的加油站当成一个源点。跑一次Dijkstra最短路。然后,对于每次查询,从查询的顶点开始dfs(用bitset记忆化每个点能够到达的加油站)。是的、就是这么简单。。。呜呜呜~~~
4. 实现代码
#include <map>#include <set>#include <queue>#include <ctime>#include <cstdio>#include <bitset>#include <string>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int MAXN = 10000 + 100;const int MAXE = 50000 + 100;int n, m, sn, qn, sx[MAXN], qx[MAXN];int idx[MAXN];bitset<1001> bs[MAXN];template<class T>struct Dijkstra { struct Edge { T w; int v, nxt; } E[MAXE << 1]; typedef pair<T, int> PII; typedef PII QNode; int head[MAXN], tot; T d[MAXN], INF; void init() { tot = 0; memset(head, -1, sizeof(head)); } void add(int u, int v, T w) { E[tot].v = v; E[tot].w = w; E[tot].nxt = head[u]; head[u] = tot++; } priority_queue<QNode, vector<QNode>, greater<QNode> > Q; void run() { int u; memset(d, 0x3f, sizeof(d)); INF = d[0]; while(!Q.empty()) Q.pop(); for(int i = 1; i <= sn; ++i) Q.push(PII(d[sx[i]] = 0, sx[i])); while(!Q.empty()) { PII ftp = Q.top(); Q.pop(); u = ftp.second; if(ftp.first != d[u]) continue; for(int i = head[u]; ~i; i = E[i].nxt) { int v = E[i].v; T w = E[i].w; if(d[u] + w < d[v]) { d[v] = d[u] + w; Q.push(PII(d[v], v)); } } } } void dfs(int u) { int v; T w; if(bs[u].any() != 0) return; for(int i = head[u]; ~i; i = E[i].nxt) { v = E[i].v; w = E[i].w; if(d[v] + w != d[u]) continue; dfs(v); bs[u] |= bs[v]; } } void solve() { for(int i = 1; i <= n; ++i) bs[i].reset(); for(int i = 1; i <= sn; ++i) bs[sx[i]].set(idx[sx[i]]); for(int i = 1; i <= qn; ++i) { dfs(qx[i]); for(int j = 1; j <= sn; ++j) { if(bs[qx[i]][j] == 0) continue; printf("%d ", sx[j]); } printf("\n"); } }};Dijkstra<int> dij;int main() {#ifdef ___LOCAL_WONZY___ freopen("input.txt", "r", stdin);#endif // ___LOCAL_WONZY___ int u, v, w; while(~scanf("%d %d %d %d", &n, &m, &sn, &qn)) { dij.init(); for(int i = 1; i <= m; ++i) { scanf("%d %d %d", &u, &v, &w); dij.add(u, v, w); dij.add(v, u, w); } for(int i = 1; i <= sn; ++i) scanf("%d", &sx[i]); sort(sx + 1, sx + sn + 1); memset(idx, 0, sizeof(idx)); for(int i = 1; i <= sn; ++i) idx[sx[i]] = i; for(int i = 1; i <= qn; ++i) scanf("%d", &qx[i]); dij.run(); dij.solve(); }#ifdef ___LOCAL_WONZY___ cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << "ms." << endl;#endif // ___LOCAL_WONZY___ return 0;}
阅读全文
1 0
- [CSU 2005 Nearest Maintenance Point Submit Page] Dijkstra
- 2005: Nearest Maintenance Point
- CSUOJ 2005 nearest maintenance point
- CSU 2005 Nearest Maintenance Point(最短路+bitset优化转移)
- CSU 1568Shrine Maintenance
- csu 1060 Nearest Sequence
- Twenty-four point CSU
- [CSU 1808: 地铁] Dijkstra
- CSU 1600: Twenty-four point
- CSU 1600 Twenty-four point
- Web Part Page Maintenance(Redirect to this page)
- CSU 1808 地铁(dijkstra+heap)
- CSU 1808 地铁 (Dijkstra)
- maintenance
- Ajax = One Page Less Submit
- Ajax = One Page Less Submit
- Ajax = One Page Less Submit
- Ajax = One Page Less Submit
- 1797:金银岛(4.6算法之贪心)
- 2017年 即将踏入社会的那一刻
- nginx-配置网络监听
- 一、操作系统基础知识
- linux 虚拟机模拟配置网络路由环境-简版
- [CSU 2005 Nearest Maintenance Point Submit Page] Dijkstra
- mysql server5.7 找不到my.ini,只有my-default.ini
- HDU
- Java核心技术 ( 卷 I ) 读书笔记(第一~三章)
- qt编译加速
- 2017上半年技术文章集合—184篇文章分类汇总
- HDU 6195 cable cable cable (找规律) 2017ACM沈阳赛区网络赛
- 抽奖点名
- [新手编程训练项目]004——C语言文件夹文件信息输出001:io库中_finddata_t结构体的使用