模拟赛20181016 Uva 1040 状压+搜索 2005 ACM world final problem c
题目的隐含条件将这道题指向了最小生成树;
利用类似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的更多相关文章
- 【noip模拟赛5】细菌 状压dp
[noip模拟赛5]细菌 描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
- HDU 5025 (BFS+记忆化状压搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5025 题目大意: 迷宫中孙悟空救唐僧,可以走回头路.必须收集完钥匙,且必须按顺序收集.迷宫中还有蛇, ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
- 南京网络赛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 ...
- UVA - 10817 状压DP
题意:大白P95 本题比较特别的是状压两个集合并且进行转移,因此要分别处理当前集合只有1个老师/2个老师的记录(然后可O(1)得出0个老师的集合) 记忆化过了但是迭代式不能记忆超过2的之前的状态是怎样 ...
- CF1042B 【Vitamins】(去重,状压搜索)
由题意,我们其实会发现 对于每一种果汁,其对应的状态只有可能有7种 VA VB VC VA+VB VA+VC VB+VC VA+VB+VC 这道题就大大简化了 我们把所有果汁都读进来 每种 ...
- 2019年第十届蓝桥杯省赛-糖果(一维状压dp)
看到20的数据量很容易想到状压dp. 开1<<20大小的数组来记录状态,枚举n个糖包,将其放入不同状态中(类似01背包思想) 时间复杂度O(n*(2^20)). import java.u ...
- [CSP-S模拟测试]:点亮(状压DP+树上背包DP)
题目传送门(内部题121) 输入格式 第一行,一个正整数$n$. 第二行,$n-1$个正整数$p_2,p_3,...,p_n$.保证$p_u$是在$1$到$u-1$中等概率随机选取的. 接下来$n$行 ...
随机推荐
- Windows中查看进程的资源消耗(cpu, Disk,Memory,NetWork)
1.通过Windows Task Manager 的 Performance Tab 可以看到总体的性能消耗情况. 2.如果想看系统中每个进程的资源消耗,可以点击 下面的 Open Resource ...
- CentOS 6忘记root密码的解决办法
1.在开机启动的时候按键盘上的“E”键 或者“ESC”键,会进入如下界面 2.选择相应的内核,再次按“E”,出现下图,选择第二项,再次按“E”键 3.经过第二步,这个画面可以编辑,在信息的最后加“空格 ...
- Kafka Frequently Asked Questions
This is intended to be an easy to understand FAQ on the topic of Kafka. One part is for beginners, o ...
- ctrl+shift+r / ctrl+f5 强制(不使用缓存)刷新google chrome网页
我改了csdn图片后, 一直看到的是旧图片, n天之后, 还是旧图片.猜测应该是用了缓存(且缓存更新逻辑失败, 定是csdn的bug), 用ctrl+shift+r, 或者ctrl+f5, 强制刷新页 ...
- Linux新手随手笔记1.7
配置网卡(本地电脑) Vment1 仅主机模式 Vment8 nat模式 物理机 : 192.16810.1 /255.255.255.0 服务器 : 192.168.10.10 /255. ...
- numpy数据类型dtype转换
这篇文章我们玩玩numpy的数值数据类型转换 导入numpy >>> import numpy as np 一.随便玩玩 生成一个浮点数组 >>> a = np.r ...
- css基本介绍
目录 CSS初识 构造规则 注意 样式表的定义和使用 行内式(内联样式) 内部样式表 外部样式表(外链式) 选择器 标签选择器(元素选择器) 类选择器 id选择器 通配符选择器 伪类选择器 链接伪类选 ...
- CentOS配置svn
参考: https://www.cnblogs.com/taohaijun/p/7172939.html 1.检查已安装版本 rpm -qa subversion 卸载旧版本SVN yum remo ...
- Vue 环境搭建(win10)
1.安装node node官网安装地址 推荐安装稳定版本(LTS)以及安装路径为系统盘(C) 查看node安装成功否 注释:以下命令使用 命令提示符(管理员)权限,win10 对user权限的限制了访 ...
- Markdown语法基础
Markdown基本语法 创建 2018-09-07 by YANHAI 标题:Setext方式 三个或更多 大标题 === 小标题 --- 大标题 小标题 标题:Atx方式 # 内容 (一级标题) ...