hdu6166
hdu6166
题意
给出一个有向图,选择 \(k\) 个点,问这 \(k\) 个点任意两点距离的最小值。
分析
按结点编号的二进制位,每次可以把所有点分到两个集合,那么求两个集合的点间的最短路即可( \(0\)作为源点,\(n+1\)作为汇点)。
正确性的保证:编号的唯一性。任意两点一定存在某一次不在同一集合,二进制位一定有某一位不同。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, ll> P;
const int MAXN = 1e5 + 10;
const ll INF = 1e18 + 9;
int n, m;
struct node {
int to, cost;
node() {}
node(int to, int cost) : to(to), cost(cost) {}
};
vector<node> G[MAXN];
ll d[MAXN];
ll dijkstra() {
fill(d, d + MAXN, INF);
priority_queue<P, vector<P>, greater<P> > q;
d[0] = 0;
q.push(P(0, 0));
while(!q.empty()) {
P u = q.top(); q.pop();
if(d[u.second] < u.first) continue;
for(int i = 0; i < G[u.second].size(); i++) {
node nd = G[u.second][i];
if(d[nd.to] > d[u.second] + nd.cost) {
d[nd.to] = d[u.second] + nd.cost;
q.push(P(d[nd.to], nd.to));
}
}
}
return d[n + 1];
}
int se[MAXN];
int main() {
int T, kase = 1;
scanf("%d", &T);
while(T--) {
for(int i = 0; i <= n; i++) G[i].clear();
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++) {
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
G[u].push_back(node(v, c));
}
int k;
scanf("%d", &k);
for(int i = 0; i < k; i++) {
scanf("%d", &se[i]);
}
ll ans = INF;
for(int i = 0; i < 18; i++) {
G[0].clear();
for(int j = 0; j < k; j++) {
if((se[j] >> i) & 1) {
G[0].push_back(node(se[j], 0));
} else {
G[se[j]].push_back(node(n + 1, 0));
}
}
ans = min(ans, dijkstra());
for(int j = 0; j < k; j++) {
if(!((se[j] >> i) & 1)) {
G[se[j]].pop_back();
}
}
G[0].clear();
for(int j = 0; j < k; j++) {
if((se[j] >> i) & 1) {
G[se[j]].push_back(node(n + 1, 0));
} else {
G[0].push_back(node(se[j], 0));
}
}
ans = min(ans, dijkstra());
for(int j = 0; j < k; j++) {
if((se[j] >> i) & 1) {
G[se[j]].pop_back();
}
}
}
printf("Case #%d: %lld\n", kase++, ans);
}
return 0;
}
hdu6166的更多相关文章
- hdu-6166(最短路+二进制分组)
题意:给你n个点m条边的有向图,然后再给你k个不同的点,问你这k个点的最小距离: 解题思路:这道题最需要注意的就是k个点一定是不同的,那么有一个结论就是任意两个不同的数字中,在他们的二进制地表示中,一 ...
- hdu6166 Senior Pan
Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 【最短路】【dijkstra】【二进制拆分】hdu6166 Senior Pan
题意:给你一张带权有向图,问你某个点集中,两两结点之间的最短路的最小值是多少. 其实就是dijkstra,只不过往堆里塞边的时候,要注意塞进去它是从集合中的哪个起始点过来的,然后在更新某个点的答案的时 ...
- Codeforces 938.D Buy a Ticket
D. Buy a Ticket time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
随机推荐
- 51nod 1851俄罗斯方块(trick)
题目大意:给出一个黑白图,你可以选定一个俄罗斯方块的区域,黑白翻转,问能否变成白图 比较trick的题目, 首先可以想到,奇数个1肯定是无解的,所以考虑偶数个1 可以先讨论n是2的情况 当n为2时,其 ...
- 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案
转自:http://www.2cto.com/database/201503/386267.html 中文显示问号 转自:http://zhidao.baidu.com/link?url=qJDmsa ...
- [COGS 2089.] 平凡的测试数据 带权并查集
差点就撸上LCT了....... 带权并查集就是在并查集的基础上稍作修改,我的用穿址实现的有人用记录原父亲来实现. #include<cstdio> #define N 300010 us ...
- [bzoj 1143]最长反链二分图最大匹配
Dilworth定理:偏序集能划分成的最少的全序集的个数与最大反链的元素个数相等. 证明:http://www.cnblogs.com/itlqs/p/6636222.html 题目让求的是最大反链的 ...
- Codeforces Round #506 (Div. 3) 题解
Codeforces Round #506 (Div. 3) 题目总链接:https://codeforces.com/contest/1029 A. Many Equal Substrings 题意 ...
- Cannot load project: com.intellij.ide.plugins.PluginManager$StartupAbortedException
今天电脑突然蓝屏,idea异常关闭,开机重启后,打开idea,点击项目出现 Cannot load project: com.intellij.ide.plugins.PluginManager$St ...
- css3 新旧伸缩盒的异同
由于不需要理会IE浏览器,伸缩盒(flexible box)移动端开发中非常好用! 工作中使用APICLOUD开发手机App,老板要求兼容到安卓2.3(新版的需要安卓4.4以上),所以一直使用的是旧版 ...
- 【BZOJ1419】 Red is good [期望DP]
Red is good Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 桌面上有R张红牌和B张 ...
- I wrote a JSONHelper extension
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonso ...
- php发送请求
$opts = array( 'http'=>array( 'method'=>"GET", 'timeout'=>10, ));$context = strea ...