P3489 [POI2009]WIE-Hexer

大陆上有n个村庄,m条双向道路,p种怪物,k个铁匠,每个铁匠会居住在一个村庄里,你到了那个村庄后可以让他给你打造剑,每个铁匠打造的剑都可以对付一些特定种类的怪物,每条道路上都可能出现一些特定种类的怪物,每条道路都有一个通过所需要的时间,现在要从1走到n,初始的时候你没有剑,要求在经过一条道路的时候,对于任意一种可能出现在这条道路上的的怪物,你都有已经有至少一把剑可以对付他,求从1走到n的最短时间(打造剑不需要时间)

最短路上状压DP。

可以把当前对于可不可以消灭每种怪物压成一个状态,跟随最短路转移即可。

code:

#include <iostream>
#include <cstdio>
#include <queue>#define int long longusing namespace std;const int wx=20017;inline int read(){int sum=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}return sum*f;
}int head[wx],dis[217][wx],vis[217][wx];
int flag[wx];
int num,n,m,p,WX,ans=0x3f3f3f3f,k;struct e{int nxt,to,dis,flag;
}edge[wx*2];void add(int from,int to,int dis,int flag){edge[++num].nxt=head[from];edge[num].to=to;edge[num].dis=dis;edge[num].flag=flag;head[from]=num;
}struct node{int u,d,flag;friend bool operator < (const node & a,const node & b){return a.d>b.d;}
};priority_queue<node > q;void Dij(){for(int i=1;i<=n;i++)for(int j=0;j<WX;j++)dis[i][j]=0x3f3f3f3f,vis[i][j]=0;q.push((node){1,0,flag[1]}); dis[1][flag[1]]=0;while(q.size()){int u=q.top().u; int flaag=q.top().flag; q.pop();if(vis[u][flaag])continue; vis[u][flaag]=1;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if((flaag&edge[i].flag)!=edge[i].flag)continue;if(dis[v][flaag|flag[v]]>dis[u][flaag]+edge[i].dis){dis[v][flaag|flag[v]]=dis[u][flaag]+edge[i].dis;q.push((node){v,dis[v][flaag|flag[v]],flaag|flag[v]});if(v==n)ans=min(ans,dis[v][flaag|flag[v]]);}}}for(int i=0;i<WX;i++)ans=min(ans,dis[n][i]);
}signed main(){n=read(); m=read(); p=read(); k=read();WX=(1<<p+1);for(int i=1;i<=k;i++){int x,y;x=read(); y=read();for(int j=1;j<=y;j++){int z; z=read();flag[x]|=(1<<z);}}for(int i=1;i<=m;i++){int x,y,z,c,zmj=0;x=read(); y=read(); z=read(); c=read();for(int j=1;j<=c;j++){int b; b=read(); zmj|=(1<<b);}add(x,y,z,zmj); add(y,x,z,zmj);}Dij();if(ans==0x3f3f3f3f)ans=-1;printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/wangxiaodai/p/9878420.html

最短路+状压DP【洛谷P3489】 [POI2009]WIE-Hexer相关推荐

  1. [状压dp]洛谷 P2157 学校食堂

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  2. [状压dp] 洛谷 P1879 玉米田

    题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...

  3. YYHS-蜀传之单刀赴会(梦回三国系列T2)(最短路+状压dp)

    题目描述 [题目背景] 公元215年,刘备取益州,孙权令诸葛瑾找刘备索要荆州.刘备不答应,孙权极为恼恨,便派吕蒙率军取长沙.零陵.桂阳三郡.长沙.桂阳蜀将当即投降.刘备得知后,亲自从成都赶到公安(今湖 ...

  4. [2021-09-09 T3] 序列/luogu P3943 星空(异或差分+bfs最短路+状压dp)

    序列 description solution code description 题目描述 长度为nnn的序列,初始全为000,每次可以选择⼀个数ai(1≤i≤l)a_i(1\le i\le l)ai ...

  5. 牛客网 小白月赛4 D-郊区春游 最短路+状压dp

    链接: https://www.nowcoder.com/acm/contest/134/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  6. 牛客-十二桥问题【最短路,状压dp】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/1104/B 题目大意 nnn个点mmm条边的无向图,kkk条必须经过的边,求从1出发经过这kkk条边再回到1的 ...

  7. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  8. poj3254/洛谷P1896 状压dp

    http://poj.org/problem?id=3254 https://www.luogu.org/problemnew/show/P1896 把这两题放在一起,解题思路差不多.以POJ的为例 ...

  9. 洛谷P1896 互不侵犯【状压DP】

    题目链接:P1896 互不侵犯 分析:普通的状压DP再多加一维记个数,然后找到能转移到当前的状态更新答案: #include<bits/stdc++.h> using namespace ...

  10. 洛谷P2704 [NOI2001]炮兵阵地(状压dp)

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P&quo ...

最新文章

  1. C++面试知识点总结
  2. 这里有三位程序员,你能找出来吗?| 每日趣闻
  3. linux chown 命令 更改设置文件对应的用户和组
  4. java get不支持_java – HTTP Get:只下载头文件? (HEAD不支持)
  5. SECURITY_ATTRIBUTES 句柄继承
  6. Python json使用实例:字符串与对象互转代码示例
  7. Oracle日志分类
  8. 如何将原图和json融合_图像语义分割出的json文件和原图,用plt绘制图像mask
  9. GeoPoint与LocationData
  10. 修复SVCHOST.EXE出现0x745f2780错误
  11. Flex Gumbo中如何自定义HSlider数据Tip样式的例子
  12. 云服务 华为p10 短信_苹果、小米、华为,手机云服务哪家强?
  13. 运行MonkeyRunner时使用Genymotion模拟器
  14. div+css命名大全
  15. Maven具体解释之------maven版本号管理
  16. python 数据流中的移动平均值_Python实现数据流中的中位数【堆】
  17. Effective C++ Notebook
  18. iOS 各种项目源码集
  19. C# 填充Excel
  20. i.MX6ULL处理器GPIO寄存器配置原理

热门文章

  1. glassfish3新建domain
  2. 研究预测2022年全球VoLTE市场规模达348亿美元
  3. HTTP, WWW-Authenticate, Authorization 验证授权 | Apache验证 | Python处理
  4. openssl学习笔记--CA及https网站证书配置
  5. VMware vSphere ESX 迁移到 ESXI 指南
  6. BF2 战地风云2常见问题解答
  7. 【JavaScript】回流(reflow)与重绘(repaint)
  8. [BZOJ1415]聪聪和可可
  9. Android Problem- android.content.res.Resources$NotFoundException: String resource ID #0xa
  10. [DOTween]使用过程中的一些注意事项记录