刷题记录:牛客NC16122郊区春游
传送门:牛客
题目描述:
今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi,
路费是Ci。经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考虑玩耍的顺序),但是由于他们的班
费紧张,所以需要找到一条旅游路线使得他们的花费最少,假设他们制定的旅游路线为V1, V2 ,V3 ... VR,那么
他们的总花费为从V1到V2的花费加上V2到V3的花费依次类推,注意从铁子班上到V1的花费和从VR到铁子班上
的花费是不需要考虑的,因为这两段花费由学校报销而且我们也不打算告诉你铁子学校的位置。
输入:
4 6 3
2 3 4
1 2 4
2 3 3
4 3 1
1 4 1
4 2 2
3 1 6
输出:
3
但是对于本题来说,我感觉题目讲的并不是很清楚,首先它并没有说确保存在只有上述几个点的回路,但是照通过的代码来看是默认确保的,所以我的代码和讲解也是默认确保的
一道经典的TSP问题,对于此题,若不太清楚先去看看博主的本篇文章,在这篇文章中,对TSP进行了完备的介绍.
然后对于此题,首先我们应该明白,我们可以使用floyd求出每一个节点之间的最短距离.这样的话对于每一个点来说只要经过一次就可以了,因为两点之间已经是最短距离了,走多次只会花更多的时间,所以本题就转化成了经典的TSP问题,直接套上即可
然后对于本题来说,因为是不用回到最开始的地方的,所以使用顺推的解决方法比倒推更为容易,并且因为刚开始可以任选源点,所以我们应当将刚开始只有一个节点的状态的花费赋值为0,对于最终的答案找一个最小值即可
下面是具体的代码部分:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
#include <deque>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
#define ll_maxn 0x3f3f3f3f3f3f3f3f
const double eps=1e-8;
int m,n,r;int mp[220][220];int Want_go[220];int dp[1<<16][16];
int main() {memset(mp,0x3f,sizeof(mp));memset(dp,0x3f,sizeof(dp));n=read();m=read();r=read();for(int i=0;i<r;i++) Want_go[i]=read();for(int i=1;i<=m;i++) {int u=read(),v=read(),w=read();mp[u][v]=min(mp[u][v],w);mp[v][u]=mp[u][v];}for(int k=1;k<=n;k++) {for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) {if(i==j) continue;mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);}}}for(int i=0;i<r;i++) dp[1<<i][i]=0;for(int S=1;S<(1<<r);S++) {for(int u=0;u<r;u++) {if(!((S>>u)&1)) continue;for(int v=0;v<r;v++) {if((S>>v)&1) continue;dp[S|(1<<v)][v]=min(dp[S|(1<<v)][v],dp[S][u]+mp[Want_go[u]][Want_go[v]]);}}}int ans=inf;for(int i=0;i<r;i++) {ans=min(ans,dp[(1<<r)-1][i]);}cout<<ans<<endl;return 0;
}
刷题记录:牛客NC16122郊区春游相关推荐
- 刷题记录:牛客NC24608[USACO 2011 Ope S]Learning Languages
传送门:牛客 题目描述: [USACO11OPEN]Learning Languages S 农夫约翰的 N ( 2 < = N < = 10 , 000 ) N(2<=N<= ...
- 刷题记录:牛客NC16129小小粉刷匠
传送门:牛客 题目描述: "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开心地刷着墙",兴致突然被打断,"小名,你今天如果刷不 完这一栋楼的 ...
- 刷题记录:牛客NC17889新建 Microsoft Office Word 文档
传送门:牛客 题目描述: CSL正在学习<计算机办公自动化>文件的建立与删除. CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office W ...
- 刷题记录:牛客NC17193简单瞎搞题
传送门;牛客 题目描述: 一共有 n个数,第 i 个数是 xi xi 可以取 [ l i , r i ] [li , ri] [li,ri] 中任意的一个值. 设 S = ∑ x i 2 S = \s ...
- 刷题记录:牛客NC24083Greedy Gift Takers
传送门:牛客 题目描述 Farmer John's nemesis, Farmer Nhoj, has NNN cows (1≤N≤1051 \leq N \leq 10^51≤N≤105), con ...
- 刷题记录:牛客NC20811蓝魔法师
传送门:牛客 题目描述: "你,你认错人了.我真的,真的不是食人魔."--蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不 同当且仅当存在 ...
- 刷题记录:牛客NC20875舔狗舔到最后一无所有
传送门:牛客 题目描述: 作为队伍的核心,forever97很受另外两个队友的尊敬. Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家fo ...
- 刷题记录:牛客NC15162小H的询问
传送门:牛客 题目描述: 小H给你一个数组{a},要求支持以下两种操作: 1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认 ...
- 刷题记录:牛客NC15447wyh的问题
传送门:牛客 题目描述: 我国现在能源消耗非常严重,现在政府有这样一个工作,每天早上都需要把一些路灯关掉,但是他们想 让在关闭的过程中所消耗的能源是最少的,负责路灯关闭的工作人员以1m/s的速度进行行 ...
最新文章
- python机器学习库_Python机器学习库 Top 10,你值得拥有!
- 招商局集团内部控制手册pdf_企业内部控制流程手册,全文22模块,内容很全面,可直接打印使用...
- html、css 【珍藏】
- 理解新增贷款、M2、社会融资总量之间的关系
- java if在内存中_java如何将对象暂存到内存中?
- [剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]
- PingInfoView批量PING工具
- html5中地理位置,Chrome中的HTML 5地理位置提示
- Linux系统的用途
- 【Git/Github学习笔记】Git常用命令(代码冲突二)
- 一行 Python 代码能实现有趣功能
- clover写入efi_黑苹果安装核心文件-四叶草引导Clover EFI 配置文件结构讲解
- 产品需求分析思路和方法
- matlab方波经过低通滤波,方波滤波matlab的实现
- 重装Win10系统其他盘的东西还在吗?
- 1. 语音类实现 (实现读取wav/pcm,STFT)
- 第31章 	TIM—基本定时器—零死角玩转STM32-F429系列
- 怎么把ppt转化成图片
- java table数据转excel,excel将数据转化成表格-如何将java数据转换成Excel表格
- 福昕阅读器给pdf创建目录方法