题目的隐含条件将这道题指向了最小生成树;

利用类似prim的方法,枚举所有子图并判断是否包含询问点,如果包含那么可以更新答案;

边统计边更新,且由于更新一定是向更多的点状态下更新,所以一定可以统计到答案,不至于到全部是inf的情况

再更新答案时记录ps,pe两个变量分别表示此状态最后一次更新前的状态,边,会在寻找路径时用到

最后统计到的答案ans,走到初始的t,路径中打下vis标记后再从头dfs沿着vis打过的走下去,并在路径中遇到叶子节点时顺便将走过的路径放入vector

最后利用vector输出即可

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define dec(i,x,y) for(register int i=x;i>=y;i--)
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;} const int N=;
const int M=;
const int inf=0x3f3f3f3f; vector<int> v[N];
int n,t,m,q,x,all,ans,mx,ask[N];
int dp[<<],ps[<<],pe[<<];
bool vis[N]; int head[N],tot=;
struct node{int v,w,next;bool vis;}e[N*N<<];
void insert(int u,int v,int w){
e[++tot]=(node){v,w,head[u],};head[u]=tot;
e[++tot]=(node){u,w,head[v],};head[v]=tot;}
inline int count(int x){
int ans=;while(x) ans++,x-=x&(-x);return ans;} int s[N],top; void dfs(int u,int f){ s[++top]=u;
if(vis[u]){
dec(i,top,) v[u].push_back(s[i]);}
//将目前的记录顺序放入vector
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v==f||e[i].vis==) continue;
dfs(v,u);
}--top;
} int main(){
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
n=read(),t=read(),m=read();
rep(i,,m){int u=read(),v=read(),w=read();insert(u,v,w);}
q=read();rep(i,,q) x=read(),all|=(<<(x-)),vis[x]=,ask[i]=x;
//all 记录全部的询问点的集合 memset(dp,inf,sizeof dp);dp[<<(t-)]=;ans=inf;
//利用含t的集合更新答案,最后包含的集合一定有t
rep(i,,(<<n)-){
if((i&all)==all){//更新答案的集合包含
if(dp[i]<ans){
ans=dp[i];mx=i;
}else if(dp[i]==ans){
if(count(i)<count(mx))//比较集合点数多少
mx=i;
}continue;
}
for(int j=;j<=n;j++)if((<<(j-))&i){
for(int k=head[j];k;k=e[k].next){
//沿着边更新答案
int v=e[k].v,w=e[k].w;
if((<<(v-))&i) continue;
if(dp[i|(<<(v-))]>dp[i]+w)
dp[i|(<<(v-))]=dp[i]+w,
ps[i|(<<(v-))]=i,pe[i|(<<(v-))]=k;
//ps代表i上一个状态转移来的集合(点集),
//pe代表 i上一次转移的边
}
}
}
printf("distance = %d\n",ans);
//利用已有标记爬回去
while(mx!=(<<(t-))) e[pe[mx]].vis=,mx=ps[mx];
dfs(t,);//再正着下来,记录顺序,放入vector
rep(i,,q){
for(int j=;j<v[ask[i]].size()-;j++)
printf("%d-",v[ask[i]][j]);
printf("%d\n",v[ask[i]][v[ask[i]].size()-]);} return ;}

模拟赛搬的就是这道,本地A了但是提交UVA wa掉了,OJ实在太麻烦所以就咕咕咕了(喵喵喵),如果有ctrl c的同学可能会比较惨,不怪我了...haha

完结撒花

模拟赛20181016 Uva 1040 状压+搜索 2005 ACM world final problem c的更多相关文章

  1. 【noip模拟赛5】细菌 状压dp

    [noip模拟赛5]细菌   描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...

  2. 【CSP模拟赛】Adore(状压dp 二进制)

    题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...

  3. HDU 5025 (BFS+记忆化状压搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5025 题目大意: 迷宫中孙悟空救唐僧,可以走回头路.必须收集完钥匙,且必须按顺序收集.迷宫中还有蛇, ...

  4. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

  5. 南京网络赛E-AC Challenge【状压dp】

    Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...

  6. UVA - 10817 状压DP

    题意:大白P95 本题比较特别的是状压两个集合并且进行转移,因此要分别处理当前集合只有1个老师/2个老师的记录(然后可O(1)得出0个老师的集合) 记忆化过了但是迭代式不能记忆超过2的之前的状态是怎样 ...

  7. CF1042B 【Vitamins】(去重,状压搜索)

    由题意,我们其实会发现 对于每一种果汁,其对应的状态只有可能有7种 VA​ VB​ VC​ VA+VB​ VA+VC​ VB+VC​ VA+VB+VC 这道题就大大简化了 我们把所有果汁都读进来 每种 ...

  8. 2019年第十届蓝桥杯省赛-糖果(一维状压dp)

    看到20的数据量很容易想到状压dp. 开1<<20大小的数组来记录状态,枚举n个糖包,将其放入不同状态中(类似01背包思想) 时间复杂度O(n*(2^20)). import java.u ...

  9. [CSP-S模拟测试]:点亮(状压DP+树上背包DP)

    题目传送门(内部题121) 输入格式 第一行,一个正整数$n$. 第二行,$n-1$个正整数$p_2,p_3,...,p_n$.保证$p_u$是在$1$到$u-1$中等概率随机选取的. 接下来$n$行 ...

随机推荐

  1. Vue.js01:跑马灯效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. robotFramework第二篇之关键字的定义和使用

    lesson.robot *** Keywords *** 打开谷歌浏览器并访问百度首页 Log 打开浏览器,输入http://www.baidu.com,进入百度首页 输入用户名 [Argument ...

  3. 使用docker快速搭建nginx+php环境

    在朋友的强烈推荐下,走上了docker之路.经过了繁琐的docker环境安装,看了下镜像/容器的简单使用,开始进行nginx+php环境的搭建,本文记录一下在安装过程中的笔记. 原文地址:代码汇个人博 ...

  4. 好程序员告诉你HTML好在哪里,为什么值得我们学习

    好程序员告诉你HTML好在哪里,为什么值得我们学习,HTML5对于用户来说,提高了用户体验,加强了视觉感受.HTML5技术在移动端,能够让应用程序回归到网页,并对网页的功能进行扩展,用户不需要下载客户 ...

  5. soamanager发布的Webservice服务,调用时出现http500报错

    最近再给薪酬那边发布ws服务时出现了报错,调用方反馈了errorCode:BEA-380002.在使用XMLspy工具去调用这个WSDL时候,则反馈http500的错误消息.如下图: 遇到这种问题我通 ...

  6. JAVA 调用exe程序执行对应的文件 (个人用于编译Java文件)

    需求: 需要利用Java程序,来调用计算机本身的黑窗口,来将特定的Java文件编译成对应的字节码文件. 实现思路: 通过调用Java的Runtime类,每个 Java 应用程序都有一个 Runtime ...

  7. VS2019 离线安装方法详解

    本文详细介绍了 VS2019 离线安装的相关步骤,以桌面开发为主下载 C++桌面开发..NET 桌面开发相关的工作负载.MFC 可选组件及帮助查看器. 工作负载(Workload) 离线安装需要先根据 ...

  8. 菜鸟学IT之简易四则运算程序开发

    作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166 作业要求: 任何编程语言都可以,命令行程序接受一个数字输入,然后 ...

  9. JS获取登录者IP和登录城市

    登录城市:<sp class="cy"></sp><br /> 管理员个数:<font color=</strong>< ...

  10. 如何实现Echart不刷新页面,多语言切换下的地图数据重新加载,api请求数据加载,soketed数据实时加载

    可视化项目中经常用到ecahrt,各种异步加载,连接socket,多语言切换等问题,现在汇总一下: Ecahrt初始化,全局统一init,可以初始化为0,等待后续数据操作 1.如果是api重新请求,数 ...