【题意】

给定一个n点m边的无向图,要求1开始n结束而且顺序经过k个点,给出经过关系x,y代表y必须在x之后经过,求最短路。

【思路】

先对k个点进行spfa求出最短路。

设f[s][i]代表经过点集为s且目前处于i,则有转移式:

f[s][i]<-f[s|(1<<j)][j],s必须包含需要在j之前经过的所有点

用a[i]表示需要在在经过i之前经过的所有点集,即可完成判断。

【代码】

 #include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 5e4+;
const int M = 5e5+;
const int NK = ;
const int inf = 2e9; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} struct Edge {
int v,w,nxt;
}e[M];
int en=,front[N];
void adde(int u,int v,int w)
{
e[++en]=(Edge){v,w,front[u]}; front[u]=en;
} int n,m,K,bin[NK];
int f[<<NK][NK];
int dis[NK][N],a[N];
queue<int> q; int inq[N]; void spfa(int s) {
memset(inq,,sizeof(inq));
FOR(i,,n) dis[s][i]=inf;
q.push(s); inq[s]=; dis[s][s]=;
while(!q.empty()) {
int u=q.front(); q.pop(); inq[u]=;
trav(u,i) {
int v=e[i].v;
if(dis[s][v]>dis[s][u]+e[i].w) {
dis[s][v]=dis[s][u]+e[i].w;
if(!inq[v])
inq[v]=,q.push(v);
}
}
}
} int dp(int now,int u) {
int& ans=f[now][u];
if(ans>=) return ans;
if(now==bin[K]-) return dis[u][n-];
ans=inf;
FOR(i,,K)
if((now&a[i])==a[i])
ans=min(ans,dp(now|bin[i-],i)+dis[u][i]);
return ans;
} int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
bin[]=;
FOR(i,,NK-) bin[i]=bin[i-]<<;
n=read(),m=read(),K=read();
FOR(i,,m) {
int u=read(),v=read(),w=read();
u--,v--;
adde(u,v,w),adde(v,u,w);
}
FOR(i,,K) spfa(i);
int x=read();
while(x--) {
int u=read(),v=read();
a[v-]|=bin[u-];
}
memset(f,-,sizeof(f));
printf("%d",dp(,));
return ;
}

bzoj 1097 [POI2007]旅游景点atr(最短路,状压DP)的更多相关文章

  1. BZOJ 1097: [POI2007]旅游景点atr( 最短路 + 状压dp )

    先最短路预处理, 然后状压就行了 -------------------------------------------------------------------------- #include ...

  2. 【BZOJ1097】[POI2007]旅游景点atr 最短路+状压DP

    [BZOJ1097][POI2007]旅游景点atr Description FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺 ...

  3. 【BZOJ】1097: [POI2007]旅游景点atr(spfa+状压dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1097 首先还是我很sb....想到了分层图想不到怎么串起来,,,以为用拓扑序搞转移,,后来感到不行. ...

  4. BZOJ 1097: [POI2007]旅游景点atr 状态压缩+Dijkstra

    题解: $k<=20,$ 考虑状压dp. 从 $1$ 号点走到 $n$ 号点经过的点的个数可能会非常多,但是强制要求经过的点一共才 $20$ 个. 而我们发现这个题好就好在可以经过某个城市,而不 ...

  5. BZOJ 1097: [POI2007]旅游景点atr [DP 状压 最短路]

    传送门 题意: 一个无向图,从$1$到$n$,要求必须经过$2,3,...,k+1$,给出一些限制关系,要求在经过$v \le k+1$之前必须经过$u \le k+1$ 求最短路 预处理出$1... ...

  6. BZOJ1097: [POI2007]旅游景点atr

    ..k次最短路后,考虑如何满足先走一些点 用状压dp,每一个点考虑它所需要经过的点a[i],当当前走过的点包含a[i]时,i 这个点才可以到达. 写的时候用记忆化搜索. #include<bit ...

  7. bzoj [POI2007]旅游景点atr 状态压缩+Dij

    [POI2007]旅游景点atr Time Limit: 30 Sec  Memory Limit: 357 MBSubmit: 2258  Solved: 595[Submit][Status][D ...

  8. 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...

  9. [POI2007]旅游景点atr

    Description FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之 ...

随机推荐

  1. 用static关键字修饰类

    Java里面static一般用来修饰成员变量或函数.但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以.被static修饰的内部类可以直接作为一个普通类来使用,而 ...

  2. dubbo与zookeeper安装手册

    原文 示例提供者安装 (+) (#) 安装: wget http://code.alibabatech.com/mvn/releases/com/alibaba/dubbo-demo-provider ...

  3. Orcle数据库查询练习复习:二

    一.题目 1.找出所有成绩均低于80的学生姓名 select sname from student where sid in( ) select sname from student where si ...

  4. java:装饰者模式,节点流和处理流

    接口: interface Worker { public void dowork(); } 清洁工:被装饰者,节点流 class Clean implements Worker { public v ...

  5. ios中addtarget的用法

    1.addtarget 的.部分使用事件没有直接的操作方式,需要进行调用.就要用addTarget. - (void)setupCustomView { self.customView = [[CHV ...

  6. ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...

  7. Android Studio 我常用快捷键

    0. Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类 1. 重载方法 Ctrl+O 2.Ctrl+shift+Enter:自动匹配相对应的语法结构,比如if,do-while,t ...

  8. 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Json数据处理——Json数据概述

    [前白] 一些基础的东西本系列中就不再详述了,争取尽量写些必不可少的技术要点. 由于本系列把Web Service 构建放到了第二部分,Android项目就采用新浪微博API v2作为服务器端. [原 ...

  9. BZOJ 2179 FFT快速傅里叶

    fft. #include<set> #include<map> #include<ctime> #include<queue> #include< ...

  10. I.MX6 lcd lvds hdmi bootargs

    /********************************************************************* * I.MX6 lcd lvds hdmi bootarg ...