模拟赛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$行 ...
随机推荐
- WebApi接收post方式传入的json数据
[RoutePrefix("Api")] public class UploadController:BaseApiController { [HttpPost] [Route(& ...
- WebStrom中实现Vue项目的快速启动
工具:WebStrom+vue 前提:你已经安装了node.js,vuejs,会创建vue项目等一系列的操作 发生场景:希望在WebStrom中能够快速启动vue的项目,省去npm install, ...
- 我的Windows日常——炫酷的windows组件命令行打开方式
regedit -------注册表编辑器 gpedit.msc-------组策略编辑器 secpol.msc--------本地安全策略 control ----------控制面板 cmd--- ...
- 如何改善SSH连接过慢(效率)
+++++++++++++++++++++++++++++++++++++++++问题:通过SSH链接远程Linux主机过慢.重点:学习如何通过调整ssh_config配置文件,提高SSH连接效率.时 ...
- java中异常处理finally和return的执行顺序
根据个人亲自测试,得出如下结果: 1.try,catch中有没有return,finnally都会执行,而且是先执行try,catch后,最后执行finnally语句: 2.如果finnally中有r ...
- nodejs部署方式-pm2
目前Nodejs开发中有很多痛点,其中有一个是修改完代码以后需要我们重启服务才能看到效果.这样一次次的杀进程.重启,杀进程.重启很让人头大.程序员是最痛恨重复工作的物种,之前有了解过的同学可能知道 f ...
- 验证码的实现py3
import randomflag = 1try_=0while (flag): try_ +=1 yan = "" for i in range(0,4): cun=random ...
- for循环增强
for(声明语句 : 表达式) { //代码句子 } 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配.其作用域限定在循环语句块,其值与此时数组元素的值相等. 表达式:表达式是要访问的 ...
- Re.FFT
前言 上虽然算是学过了但是实质上还是根本什么都不会 看大佬们的模板去A了模题(手动滑稽) 于是下定决心要理解FFT的代码 一些的证明主要是从算法导论和两位大佬的博客上学的 大佬1 大佬2 在这过程中 ...
- yii2在控制器中调用另一个控制器方法
Yii::$app->runAction(控制器/方法名);