Senior Pan

Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1411    Accepted Submission(s): 558

Problem Description
Senior Pan fails in his discrete math exam again. So he asks Master ZKC to give him graph theory problems everyday.
The task is simple : ZKC will give Pan a directed graph every time, and selects some nodes from that graph, you can calculate the minimum distance of every pair of nodes chosen in these nodes and now ZKC only cares about the minimum among them. That is still too hard for poor Pan, so he asks you for help.
Input
The first line contains one integer T, represents the number of Test Cases.1≤T≤5.Then T Test Cases, for each Test Cases, the first line contains two integers n,m representing the number of nodes and the number of edges.1≤n,m≤100000
Then m lines follow. Each line contains three integers xi,yi representing an edge, and vi representing its length.1≤xi,yi≤n,1≤vi≤100000
Then one line contains one integer K, the number of nodes that Master Dong selects out.1≤K≤n
The following line contains K unique integers ai, the nodes that Master Dong selects out.1≤ai≤n,ai!=aj
Output
For every Test Case, output one integer: the answer
Sample Input
1
5 6
1 2 1
2 3 3
3 1 3
2 5 1
2 4 2
4 3 1
3
1 3 5
Sample Output
Case #1: 2
Source
题目大意:给定一个n个点m条边的有向带权图,其中有k个特殊点,求这k个特殊点之间两两最短路的最小值。
分析:没做过这类题根本想不到.
   因为是求两两最短路的最小值,可以考虑把dijkstra变成多源的,也就是把这k个特殊点分成两组,一组当作源点,一组当作汇点,因为dijkstra算法每次找距离最小的出来扩展嘛,那么作为源点的一组最先被扩展到的距离就是这次dijkstra算法应该返回的答案.
   但是怎样分组才能不遗漏的计算完呢?
   考虑一种神奇的分组方式--二进制分组.将k个点的编号转化成二进制数.如果第i位1则当作源点,否则当作汇点,然后交换两组再来一次dijkstra.这样一定会考虑所有的组合方式.why?两个不同的编号,必然在二进制上有一位不同.这一位的不同将它们分成两组计算,所以每一组都计算到了,取个min就是答案.
   我认为分类方法可能还有很多,不遗漏是关键.这道题如果能想到把dijkstra变成多源的就基本上做完了.
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll;
const int maxn = ;
const ll inf = 1e17; int T,cas,n,vis[maxn],m,head[maxn],to[maxn],nextt[maxn],w[maxn],tot = ,K,a[maxn],mark[maxn];
ll d[maxn],ans = inf; struct node
{
int x;
ll len;
bool operator < (const node& a) const {
return len > a.len;
}
};
priority_queue<node> q; void add(int x,int y,int z)
{
w[tot] = z;
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} ll dijkstra()
{
while (!q.empty())
{
node u = q.top();
q.pop();
int x = u.x;
ll len = u.len;
if (mark[x])
return len;
if (vis[x])
continue;
vis[x] = ;
for (int i = head[x];i;i = nextt[i])
{
int v = to[i];
if (d[v] > d[x] + w[i])
{
d[v] = d[x] + w[i];
node temp;
temp.x = v;
temp.len = d[v];
q.push(temp);
}
}
}
return inf;
} void solve()
{
for (int i = ; i < ; i++)
{
while (!q.empty())
q.pop();
memset(vis,,sizeof(vis));
memset(mark,,sizeof(mark));
memset(d,/,sizeof(d));
for (int j = ; j <= K; j++)
{
if (( << i) & a[j])
mark[a[j]] = ;
else
{
node temp;
temp.x = a[j];
temp.len = ;
d[a[j]] = ;
q.push(temp);
}
}
ans = min(ans,dijkstra());
memset(vis,,sizeof(vis));
memset(mark,,sizeof(mark));
memset(d,/,sizeof(d));
while (!q.empty())
q.pop();
for (int j = ; j <= K; j++)
{
if (( << i) & a[j])
{
node temp;
temp.len = ;
temp.x = a[j];
d[a[j]] = ;
q.push(temp);
}
else
mark[a[j]] = ;
}
ans = min(ans,dijkstra());
}
} int main()
{
scanf("%d",&T);
while (T--)
{
ans = inf;
tot = ;
memset(head,,sizeof(head));
scanf("%d%d",&n,&m);
for (int i = ; i <= m; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
scanf("%d",&K);
for(int i = ; i <= K; i++)
scanf("%d",&a[i]);
solve();
printf("Case #%d: %lld\n",++cas,ans);
} return ;
}

hdu6166 Senior Pan的更多相关文章

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

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

  2. hdu 6169 Senior PanⅡ Miller_Rabin素数测试+容斥

    Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Pr ...

  3. HDU 6166 Senior Pan (最短路变形)

    题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...

  4. HDU - 6166:Senior Pan(顶点集合最短路&二进制分组)

    Senior Pan fails in his discrete math exam again. So he asks Master ZKC to give him graph theory pro ...

  5. HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest - Team 9 1006)

    学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memor ...

  6. HDU 6166 Senior Pan 二进制分组 + 迪杰斯特拉算法

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

  7. 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...

  8. HDU 6166 Senior Pan(k点中最小两点间距离)题解

    题意:n个点,m条有向边,指定k个点,问你其中最近的两点距离为多少 思路:这题的思路很巧妙,如果我们直接枚举两点做最短路那就要做C(k,2)次.但是我们换个思路,我们把k个点按照二进制每一位的0和1分 ...

  9. hdu 6166 Senior Pan

    http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意: 给出一张无向图,给定k个特殊点 求这k个特殊点两两之间的最短路 二进制分组 枚举一位二进制位 这一 ...

随机推荐

  1. 136.只出现一次的数字 leetcode ^运算符 JavaScript解法

    leetcode上的一道题简单题 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间 ...

  2. linux上open-vswitch安装和卸载

    一. ovs 从源码编译安装: 安装依赖项: # apt-get install make # apt-get install gcc # apt-get install build-essentia ...

  3. JAVA学习笔记--简介几个常见关键字static、final、this、super

    一.static static(静态的),可以放在类.方法.字段之前. 通常,当创建类时,就是在描述那个类的外观与行为.除非用 new 创建那个类的对象,否则,实际上并未获得任何对象.执行 new 来 ...

  4. Python异常(基础) except

    为什么要异常处理机制:在程序调用层数较深时,向主调函数传递错误信息需要层层return 返回比较麻烦,用异常处理机制可以较简单的传送错误信息 什么是错误 错误是指由于逻辑或语法等导致一个程序已无法正常 ...

  5. Python基础灬序列(字符串、列表、元组)

    序列 序列是指它的成员都是有序排列,并且可以通过下标偏移量访问到它的一个或几个成员.序列包含字符串.列表.元组. 字符串 chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪' print(c ...

  6. AOP:jdk的动态代理

    1.文件结构 2.建立接口 package com.wangcf.manager; public interface IUserManager { public void add(); public ...

  7. Android开发第二阶段(5)

    今天:对图片的替换修改,使整个app的图案化更美观. 明天:对Android的对sdcard的操作学习

  8. CocoaPods 创建私有仓库

    这里有个坑首先需要注意,创建私有cocoapods仓库需要两个git仓库,即代码仓库,Specs文件仓库. 一.创建私有库 1.创建自己源码仓库,假设是A.git; 2.对A仓库: git add . ...

  9. slf4j与logback的结合使用

    参考:http://my.oschina.net/ydsakyclguozi/blog/412240 一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logbac ...

  10. Docker 安装与常用命令介绍

    docker的镜像文件作用就是:提供container运行的文件系统层级关系(基于AUFS实现),所依赖的库文件.已经配置文件等等. 安装docker yum install -y docker 启动 ...