博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最短路+状压DP【洛谷P3489】 [POI2009]WIE-Hexer
阅读量:5096 次
发布时间:2019-06-13

本文共 1474 字,大约阅读时间需要 4 分钟。

P3489 [POI2009]WIE-Hexer

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

最短路上状压DP。

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

code:

#include 
#include
#include
#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
q;void Dij(){ for(int i=1;i<=n;i++) for(int j=0;j
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

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

你可能感兴趣的文章
Oracle中的rownum不能使用大于>的问题
查看>>
[Data Structure & Algorithm] 有向无环图的拓扑排序及关键路径
查看>>
git 常用命令
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
Vue音乐项目笔记(三)
查看>>
遍历Map对象
查看>>
计算剪贴板里仿制的代码行数
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
C#语言-04.OOP基础
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
闭包问题
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
[最小割][Kruskal] Luogu P5039 最小生成树
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>