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

利用类似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. Codeception 实战

    Codeception 测试 Php 代码 一.一句话概述 使用 cc 进行单元测试,保证现有代码质量,为以后维护与重构提供支撑. 二.目标 安装配置 cc 编写测试代码,简化开发与最大化稳定性和可维 ...

  2. Scrapy框架-Spider和CrawlSpider的区别

    目录 1.目标 2.方法1:通过Spider爬取 3. 通过CrawlSpider爬取 1.目标 http://wz.sun0769.com/index.php/question/questionTy ...

  3. 数据库【mysql篇】学习笔记

    Windows服务 -- 启动MySQL    net start mysql-- 创建Windows服务    sc create mysql binPath= mysqld_bin_path(注意 ...

  4. 数据库MySQL和Redis实践

    1.关于数据库设计的那些事 2.MySQL 3.Redis

  5. R语言学习——图形初阶之折线图与图形参数控制

    plot()是R中为对象作图的一个泛型函数(它的输出将根据所绘制对象类型的不同而变化):plot(x,y,type="b")表示将x置于横轴,y置于纵轴,绘制点集(x,y),然后使 ...

  6. docker的基本知识

    Docker 是什么? Docker 是一个开源的应用容器引擎,是基于go语言的,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. ...

  7. 好程序员web前端分享HTML基础篇

    好程序员web前端分享HTML基础篇,最近遇到很多新手,都会问,如果要学web前端开发,需要学什么?难不难学啊?多久能入门之类的问题?那么今天好程序员就先来给大家分享一下web前端学习路线:HTML基 ...

  8. Linux 系统假死的解决方案

    Linux 系统有时因为软件不兼容或未知 bug,导致系统假死.比如我的 Ubuntu 14.04 最近使用 vscode 时偶尔会导致系统假死,即鼠标可以移动,但点击无反应. 此时可试试如下解决方案 ...

  9. Command "python setup.py egg_info" failed with error code 1 in C:\Users\w5659\AppData\Local\Temp\pip-install-t7uomu4r\xa dmin\

    Error msg: C:\Users\w5659>pip install xadmin Collecting xadmin Using cached https://files.pythonh ...

  10. 哈尔滨工业大学(威海)第九届ACM程序设计竞赛 Virtual Youtuber

    链接 [https://ac.nowcoder.com/acm/contest/624/G] 题意 其实题意说的辣鸡死了,没有说明确. y is the subsequences that its s ...