HDU 6166 Senior Pan (最短路 好题)
来源:互联网 发布:26岁出国读研 知乎 编辑:程序博客网 时间:2024/06/03 19:08
题意:给你一个n个点m条边的有向带边权的图。现在给你k个点,问k个点中最近的点对距离。 n, m, k <= 1e5
思路:这题的思路好强啊。。。任意两个点在二进制表示上肯定至少有一位是不相同的,所以我们可以枚举二进制的
位数,每次把k个点中二进制某一位为1的分一个集合,为0的分一个集合,做一次最短路,找到这两个集合之间的最
短路。枚举所有二进制的位数后,这样就包含了所有点对的最短路。(求集合与集合之间点的最短路只要把起始集合
的每个点dis记为0即可,跑完最短路后dis表示的是这个集合到其他点的最短路)
代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll INF = 0x3f3f3f3f3f3f3f3f;const int maxn = 1e5+5;int n, m, k, a[maxn];struct node{ int v, w;};vector<node> g[maxn];ll dis[maxn];bool book[maxn], target[maxn];queue<int> q;void init(){ memset(target, 0, sizeof(target)); memset(book, 0, sizeof(book)); for(int i = 1; i <= n; i++) dis[i] = INF; while(!q.empty()) q.pop();}ll spfa(){ while(!q.empty()) { int u = q.front(); q.pop(); book[u] = 0; int len = g[u].size(); for(int i = 0; i < len; i++) { int v = g[u][i].v; int w = g[u][i].w; if(dis[u]+w <= dis[v]) { dis[v] = dis[u]+w; if(!book[v]) { book[v] = 1; q.push(v); } } } } ll ans = INF; for(int i = 1; i <= n; i++) if(target[i]) ans = min(ans, dis[i]); return ans;}void solve(){ ll ans = INF; for(int i = 0; i < 20; i++) { init(); for(int j = 1; j <= k; j++) { if(a[j]&(1<<i)) { q.push(a[j]); dis[a[j]] = 0; book[a[j]] = 1; } else target[a[j]] = 1; } ans = min(ans, spfa()); init(); for(int j = 1; j <= k; j++) { if(a[j]&(1<<i)) target[a[j]] = 1; else { q.push(a[j]); dis[a[j]] = 0; book[a[j]] = 1; } } ans = min(ans, spfa()); } printf("%lld\n", ans);}int main(void){ int _, ca = 1; cin >> _; while(_--) { scanf("%d%d", &n, &m); for(int i = 0; i <= n; i++) g[i].clear(); for(int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); g[u].push_back(node{v, w}); } scanf("%d", &k); for(int i = 1; i <= k; i++) scanf("%d", &a[i]); printf("Case #%d: ", ca++); solve(); } return 0;}
阅读全文
1 0
- Hdu 6166 Senior Pan【思维+随机化+最短路】好题~
- HDU 6166 Senior Pan (最短路 好题)
- HDU 6166 Senior Pan 【二进制分组最短路 】 好题
- hdu 6166 Senior Pan 最短路
- hdu 6166 Senior Pan(最短路)
- HDU 6166 Senior Pan(思维 最短路)
- HDU 6166 && 2017 多校训练:Senior Pan(最短路)
- 2017 Multi-University Training Contest 9 && HDU 6166 Senior Pan 【最短路+思维】
- HDU 6166 Senior Pan (思维枚举+最短路 求最近点对)
- HDU 6166 Senior Pan
- HDU 6166 Senior Pan
- [HDU 6166] Senior Pan
- HDU 6166 Senior Pan
- hdu-6166 Senior Pan
- HDU 6166 Senior Pan
- HDU 6166 Senior Pan
- HDU-6166 Senior Pan
- HDU 6166 Senior Pan spfa(顶点集间最短路)
- maven中常用的依赖
- Andrew Stankevich Contest 2 (ASC 2) |我为什么要开这套题
- [js高手之路] dom常用节点属性兼容性详解与应用
- A
- 关于数据降维函数sklearn-PCA的使用
- HDU 6166 Senior Pan (最短路 好题)
- CodeForces
- python运维second_chapter(1)
- gcc 参数详解
- Hbase高级特性及其优化分析
- 8.23练习感悟
- 阿里云设置端口访问、使用
- 280
- NYOJ题目219-An problem about date