JZOJ 2933. 【NOIP2012模拟8.7】找位置
题目大意
有 \(n(1 \leq n \leq 10000)\) 个城镇,由 \(1 \leq m \leq 50000\) 条无向道路连接。给出 \(k(1 \leq k \leq 5) 个超市\),现于剩下 \(n-k\) 个城镇中选择一个,使它到所有有超市的城镇再回来总路程最短
分析
注意到 \(k\) 很小,那我们就可以枚举经过这些超市的顺序,然后依次走最短路,再枚举一个另外出发城镇,由最后一个超市返回
于是就完了
\(Code\)
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N = 10005 , M = 50005;
int n , m , k , tot , cnt;
int a[N] , used[10] , b[10] , order[200][10] , vis[N] , dis[10][N] , h[N];
struct edge{
int to , nxt , w;
}e[M << 1];
struct node{
int id , d;
bool operator < (node c) const {return d > c.d;}
};
priority_queue<node> q;
void add(int u , int v , int w){e[++tot] = edge{v , h[u] , w} , h[u] = tot;}
void dij(int s)
{
memset(vis , 0 , sizeof(vis));
for(register int i = 1; i <= n; i++) dis[s][i] = 1e8;
dis[s][a[s]] = 0;
while (!q.empty()) q.pop();
q.push((node){a[s] , 0});
while (!q.empty())
{
node x = q.top();
q.pop();
if (vis[x.id]) continue;
vis[x.id] = 1;
for(register int i = h[x.id]; i; i = e[i].nxt)
if (dis[s][x.id] + e[i].w < dis[s][e[i].to])
{
dis[s][e[i].to] = dis[s][x.id] + e[i].w;
q.push((node){e[i].to , dis[s][e[i].to]});
}
}
}
void dfs(int x)
{
if (x > k)
{
++cnt;
for(register int i = 1; i <= k; i++) order[cnt][i] = b[i];
return;
}
for(register int i = 1; i <= k; i++)
if (!used[i])
{
used[i] = 1 , b[x] = i , dfs(x + 1);
used[i] = 0 , b[x] = 0;
}
}
void solve()
{
int ans = 2e9;
dfs(1);
for(register int i = 1; i <= k; i++) dij(i);
memset(vis , 0 , sizeof vis);
for(register int i = 1; i <= k; i++) vis[a[i]] = 1;
for(register int i = 1; i <= cnt; i++)
{
int sum = 0;
for(register int j = 2; j <= k; j++) sum = sum + dis[order[i][j - 1]][a[order[i][j]]];
if (sum > ans) continue;
int Mi = 1e8;
for(register int j = 1; j <= n; j++)
if (!vis[j]) Mi = min(Mi , sum + dis[order[i][1]][j] + dis[order[i][k]][j]);
ans = min(ans , Mi);
}
printf("%d" , ans);
}
int main()
{
scanf("%d%d%d" , &n , &m , &k);
for(register int i = 1; i <= k; i++) scanf("%d" , &a[i]);
int u , v , w;
for(register int i = 1; i <= m; i++)
scanf("%d%d%d" , &u , &v , &w) , add(u , v , w) , add(v , u , w);
solve();
}
JZOJ 2933. 【NOIP2012模拟8.7】找位置的更多相关文章
- JZOJ【NOIP2012模拟8.9】2020.10.5 T1
逐个击破 题目 Description 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走, ...
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
- 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号
[NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...
- JOBDU 1199 找位置
题目1199:找位置 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2645 解决:1286 题目描述: 对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 ...
- string反向找位置,分割字符串(只取文件夹路径)
1 #include <uf.h> 2 #include <uf_part.h> 3 #include <atlstr.h> 4 #include <iost ...
- 【九度OJ】题目1199:找位置 解题报告
[九度OJ]题目1199:找位置 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1199 题目描述: 对给定的一个字符串,找出有重复的 ...
- <数据结构>XDOJ333.找位置
问题与解答 问题描述 对给定的一个字符串,找出有重复的字符,并给出其位置. 输入格式 输入包括一个由字母和数字组成的字符串,其长度不超过100. 输出格式 可能有多组测试数据,对于每组数据, 按照样例 ...
- [jzoj]2938.【NOIP2012模拟8.9】分割田地
Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...
- 九度OJ 1199:找位置 (计数)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2083 解决:1010 题目描述: 对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1:a,4 ...
- [jzoj 5664] [GDOI2018Day1模拟4.6] 凫趋雀跃 解题报告(容斥原理)
interlinkage: https://jzoj.net/senior/#contest/show/2703/3 description: solution: 考虑容斥原理,枚举不合法的走的步数 ...
随机推荐
- 关于deepin-wine或wine更换字体方法
前言 首先要知道,deepin-wine打包的QQ和你自己用 deepin-wine跑的windows软件,他们所在不是同一个容器 deepin打包QQ所在的容器,在你的 ~/.deepinwine ...
- 保存sklearn中模型的两种方法(pickle、joblib)
保存sklearn中模型的两种方法(pickle.joblib) from sklearn import svm from sklearn import datasets clf = svm.SVC( ...
- socket模块/TCP协议/黏包处理
socket模块 如果我们需要编写基于网络进行数据交互的程序 意味着我们需要自己通过代码来控制我们之前 所学习的OSI七层(很繁琐 很复杂 类似于我们自己编写操作系统) socket类似于操作系统 封 ...
- 可视化编排的数据集成和分发开源框架Nifi轻松入门-上
@ 目录 概述 定义 dataflow面临挑战 特性 核心概念 架构 高级概述 安装 部署 常见处理器 入门示例 概述 定义 Nifi 官网地址 https://nifi.apache.org/ Ni ...
- python基础语法&数据类型&运算符
1.标识符 # -*- coding:utf-8 -*- # @Time :2021/1/16 10:28 # @Author :QAbujiaban # @Email :wbxztoo@163.co ...
- f-strings: Python字符串处理的瑞士军刀
从 3.6 开始,Python 新增了一个格式化字符串的方法,称之为 f-string. 其用法就是在python原始字符串的基础上增加 f/F 前缀,以大括号 {} 标明被替换的字段. f-stri ...
- 希腊字母表及latex代码
希腊字母表及latex代码 字母大写 字母小写 英文名称 latex大写代码 latex小写代码 \(\Alpha\) \(\alpha\) alpha \Alpha \alpha \(\Beta\) ...
- [机器学习] PCA (主成分分析)详解
转载于https://my.oschina.net/gujianhan/blog/225241 一.简介 PCA(Principal Components Analysis)即主成分分析,是图像处理中 ...
- Zookeeper详解(03) - zookeeper的使用
Zookeeper详解(03) - zookeeper的使用 ZK客户端命令行操作 命令基本语法 help:显示所有操作命令 ls path:使用 ls 命令来查看当前znode的子节点 -w 监听子 ...
- [WPF]Win10便签软件
项目地址 Github:项目地址 软件截图 项目中用到的技术和问题 [WPF]限制程序单例运行 [WPF]创建系统栏小图标 [WPF]程序随系统自启动 [WPF]xml序列化以及反序列化数据 [WPF ...