解题:POI 2007 Tourist Attractions
事实上这份代码在洛谷过不去,因为好像要用到一些压缩空间的技巧,我并不想(hui)写(捂脸)
先预处理$1$到$k+1$这些点之间相互的最短路和它们到终点的最短路,并记录下每个点能够转移到时的状态,然后就是状压dp辣。
设$dp[s][i]$表示状态为$s$时处在点$i$的最短路,就可以$O(2^kk^2)$转移了,注意最好减一些不合法状态,因为这时间挺危险的=。=
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,K=,inf=0x3f3f3f3f;
struct a{int node,dist;};
bool operator < (a x,a y)
{
return x.dist>y.dist;
}
priority_queue<a> hp;
int dis[N],vis[N],ss[K],dp[(<<)+][K];
int p[N],noww[*M],goal[*M],val[*M],mat[K][K];
int n,m,k,c,t1,t2,t3,cnt,len,all,ans=inf;
void link(int f,int t,int v)
{
noww[++cnt]=p[f],p[f]=cnt;
goal[cnt]=t,val[cnt]=v;
}
void Dijkstra(int s)
{
memset(vis,,sizeof vis);
memset(dis,0x3f,sizeof dis);
dis[s]=,hp.push((a){s,});
while(!hp.empty())
{
a tt=hp.top(); hp.pop(); int tn=tt.node;
if(vis[tn]) continue ; vis[tn]=true;
for(int i=p[tn];i;i=noww[i])
if(dis[goal[i]]>dis[tn]+val[i])
dis[goal[i]]=dis[tn]+val[i],hp.push((a){goal[i],dis[goal[i]]});
}
}
int ins(int x)
{
return <<(x-);
}
int main ()
{
scanf("%d%d%d",&n,&m,&k),all=(<<k)-;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
link(t1,t2,t3),link(t2,t1,t3);
}
scanf("%d",&c);
for(int i=;i<=c;i++)
scanf("%d%d",&t1,&t2),ss[t2]|=ins(t1);
for(int i=;i<=k+;i++)
{
Dijkstra(i);
for(int j=;j<=k+;j++)
mat[i][j]=dis[j]; mat[i][]=dis[n];
}
memset(dp,0x3f,sizeof dp),dp[][]=;
for(int i=;i<=all;i++)
for(int j=;j<=k+;j++)
if(dp[i][j]!=inf)
for(int h=;h<=k+;h++)
if((i&ss[h])==ss[h])
dp[i|ins(h)][h]=min(dp[i|ins(h)][h],dp[i][j]+mat[j][h]);
for(int i=;i<=k+;i++) ans=min(ans,dp[all][i]+mat[i][]);
printf("%d",ans);
return ;
}
解题:POI 2007 Tourist Attractions的更多相关文章
- csp-s模拟48,49 Tourist Attractions,养花,画作题解
题面:https://www.cnblogs.com/Juve/articles/11569010.html Tourist Attractions: 暴力当然是dfs四层 优化一下,固定两个点,答案 ...
- 解题:POI 2007 Driving Exam
题面 有点意思的题 从一个位置$i$出发可以到达每一个位置即是从$1,n$出发可以到达$i$.然后有了一个做法:把图上下反转后建反图,这样就可以求从一个点$i$到达左右两侧的花费$dp[i][0/1] ...
- 解题:POI 2007 Weights
题面 这是个$O(nlog^2$ $n)$的解法,因为蒟蒻博主没有看懂$O(nlog$ $n)$的更优秀的解法 显然从小到大装砝码是最优的方法,又显然从大到小装容器不会使得答案变劣,还显然砝码数具有单 ...
- [POI2007]Tourist Attractions
题目大意: 给你一个$n(n\leq 2\times 10^4)$个点,$m(m\leq 2\times 10^5)$条边的带边权的连通图.其中有$k(k\leq 20)$个关键点.关键点之间有$g$ ...
- LYDSY模拟赛day1 Tourist Attractions
/* 假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计 算有多少可行的 a 和 d. 设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为 (degb − 1 ...
- [POI 2007]ZAP-Queries
Description Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency) ...
- 解题:SCOI 2007 蜥蜴
题面 拆点跑最大流 所有能跑出去的点连向汇点,容量为inf 原点连向所有初始有蜥蜴的点,容量为1 每根柱子拆成两个点“入口”和“出口”,入口向出口连容量为高度的边,出口向别的有高度的柱子的入口连容量为 ...
- [POI 2007] 办公楼
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1098 [算法] 显然 , 答案为补图的连通分量个数 用链表优化BFS , 时间复杂度 ...
- 【JZOJ4857】Tourist Attractions(Bitset)
题意:给定一个n个点的无向图,求这个图中有多少条长度为4的简单路径. n<=1500 思路: #include<map> #include<set> #include&l ...
随机推荐
- jumpserver安装与部署
1.简介 Jumpserver 是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent.特点: 完全开源,GPL授权 Pyth ...
- Kubernetes探索学习004--深入Kubernetes的Pod
深入研究学习Pod 首先需要认识到Pod才是Kubernetes项目中最小的编排单位原子单位,凡是涉及到调度,网络,存储层面的,基本上都是Pod级别的!官方是用这样的语言来描述的: A Pod is ...
- 慢吞吞的pip切换源
http://blog.csdn.net/gz_liuyun/article/details/52778198
- 07慕课网《进击Node.js基础(一)》HTTP小爬虫
获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...
- vs2013+python+ cocos2d-x-3.3rc0环境搭建
1.vs2013安装一路next,安装即可,时间1~2个小时 2.解压cocos2d-x-3.3rc0 build文件夹里会有名为 cocos2d-win32.vc2012的sln文件 打开 ...
- 剑指offer:矩形覆盖
题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路: 和跳台阶那道题差不多.分别以矩形的两条边长做拓 ...
- Results the mutual for the first time(alpha阶段总结)
由于前天听大家的成果展时,做得笔记不够完善,有一两个组找不到信息,如果没有评到的组望谅解. 分数分配: 由于组内某些原因,我们现重新分组: 试用版: 总结前阶段的工作: 在前一段时间,我们第一个spr ...
- 使用mdadm创建磁盘RAID10整列,RAID5出现故障,自动替换硬盘
首先需了解mdadm的参数使用 . 第一步: 先在虚拟机中添加四块硬板 第二步:使用mdadm命令创建RAID10名称为"/dev/md0" -C代表创建操作,v 显示创建过程,- ...
- vue组件讲解(is属性的用法)
什么是组件? 在说之前我们先搞清楚什么是组件?这样对我们下边的学习是很有帮助的. 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可以重复使用的代码.在较高层次 ...
- 链表java实现
链表是用指针将多个节点联系在一起,通过头节点和尾节点还有节点数量,可以对链表进行一系列的操作.是线性表的链式存储实现. 1.链表是多个不连续的地址组成在一起根据指针链接在一起的,由多个节点组成,每个节 ...