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的更多相关文章

  1. hdu-6166(最短路+二进制分组)

    题意:给你n个点m条边的有向图,然后再给你k个不同的点,问你这k个点的最小距离: 解题思路:这道题最需要注意的就是k个点一定是不同的,那么有一个结论就是任意两个不同的数字中,在他们的二进制地表示中,一 ...

  2. hdu6166 Senior Pan

    Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  3. 【最短路】【dijkstra】【二进制拆分】hdu6166 Senior Pan

    题意:给你一张带权有向图,问你某个点集中,两两结点之间的最短路的最小值是多少. 其实就是dijkstra,只不过往堆里塞边的时候,要注意塞进去它是从集合中的哪个起始点过来的,然后在更新某个点的答案的时 ...

  4. 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 ...

随机推荐

  1. TCP/IP Note3

    TCP/IP协议 TCP/IP是不同的通信协议的大集合. 协议族:TCP/IP是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合. 1. TCP - 传输控制协议 TCP用于从应用程序到网 ...

  2. MySQL之SELECT 语句详解

    本文参考实验楼的SELECT 语句详解结合自己操作部分而写成. 注意:大多数系统中,SQL语句都是不区分大小写的,但是出于严谨和便于区分保留字和变量名,在书写的时,保留字应大写,而变量名应小写.所谓的 ...

  3. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Sta ...

  4. L2-001. 紧急救援---(Dijkstra,记录路径)

    https://www.patest.cn/contests/gplt/L2-001 L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 ...

  5. 图论:Gale-Shapley算法

    Gale-Shapley算法又叫做延迟认可算法,它可以解决这么一个问题 一共有N位男士和N位女士 每位男士对每位女士都有一个好感度,让他们结合成为N对夫妻,要求男士优先表白,最后问结合情况 第一轮,每 ...

  6. bzoj 1412 最小割 网络流

    比较明显的最小割建模, 因为我们需要把狼和羊分开. 那么我们连接source和每个羊,流量为inf,代表这条边不能成为最小割中的点,同理连接每个狼和汇,流量为inf,正确性同上,那么对于每个相邻的羊和 ...

  7. Splunk Power User认证

    课程介绍 | 通过 Splunk Fundamentals Part 1 课程考试 | 获取splunk certificate user 证书 | 课程为14节课+课后实验环境+课后习题 | 课程有 ...

  8. Python小程序之购物车

    需求: 用户入口: 1.商品信息放在文件中,从文件中读取 2.已购商品,余额记录,第一要输入起始金额,以后不需要二次输入 商家入口: 2.可以添加商品,修改商品价格 # Author:Lee Siri ...

  9. camera摄像原理之三:色温和自动白平衡【转】

    转自:http://blog.csdn.net/ghostyu/article/details/7912863 色温的定义:将黑体从绝对零度开始加温,温度每升高一度称为1开氏度(用字母K表示),当温度 ...

  10. 算法题之Climbing Stairs(leetcode 70)

    题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...