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

利用类似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. Unity切换到安卓平台Shader丢失(opengl)

    Unity安卓平台shader平台丢失 Unity的工程切换到Android平台后,运行游戏出现shader丢失 解决办法:在Unity桌面图标的快捷方式后添加 -force-gles20 示例:&q ...

  2. .Net Core 在Linux服务器下部署程序--(4). 前端ReactWeb应用部署

    确认第二步中的软件已经安装完成 Nodejs前端Web服务器 Zip与UnZip压缩包软禁 nrm前端包源管理器 PM2前端Web程序守护进程 创建部署文件夹 如果已经执行过( 3. 租户平台后端程序 ...

  3. saiku环境搭建

    说明:搭建saiku环境,BI展示工具. 环境说明: os:windows7 jdk:jdk1.6.0_43 tomcat:apache-tomcat-7.0.62 saiku:saiku-ui-2. ...

  4. centos7下给bond网卡配置bridge桥接

    这篇的主题可以用几个关键字组合:centos7+kvm + bond + bridge .brige主要用在KVM虚拟化环境下,而bond是进行物理层面的冗余.具体配置信息如下 物理网卡名称:enp0 ...

  5. 有关CSS的overflow和border-radius的那些事,你的圆角被覆盖了吗?

    事件起因 最初是网友的一个提问,来自于我的知识星球社区: 说实话,不得不佩服这个网友的眼力,这么小的细节都能发现.不过这也正是 FineUI 一直前进的动力,来自社区的监督和促进. 从截图上看,貌似圆 ...

  6. .NET开源快速开发框架Colder发布 (NET452+AdminLTE版)

    .NET开源快速开发框架Colder(NET452+AdminLTE版) 引言 半年前将基于Easyui的快速开发框架开源,三个版本(NET4.52,NETCore和NET4.0)总共荣获200+星, ...

  7. ginput函数用法

    1.ginput函数:获取指定点坐标值 2.用法说明 (1)[x,y] = ginput(n) 函数从当前的坐标轴上选择n个点,并返回这n个点相应的坐标值(x,y).这n个点可由鼠标定位.用户可以按下 ...

  8. Django Rest Framework(一)

    •基于Django 先创建一个django项目,在项目中创建一些表,用来测试rest framework的各种组件 class UserInfo(models.Model): "" ...

  9. visual studio中各文件的输出路径

    dll或exe输出路径一般在 配置属性->链接器->常规->输出文件 中 若该路径与 配置属性->常规 中的输出目录+目标文件名+目标文件扩展名不一致,可能会有提示,建议保持一 ...

  10. ubuntu下python跑任务输出到文件中遇到的一些问题(输出重定向)

    之前主要是参考https://www.cnblogs.com/chason95/articles/9760291.html 一般使用 python test.py > ./log.txt 或 p ...