分析:

我们可以考虑,因为我们必须经过这些节点,那么我们可以将它状压,并且我们因为可以重复走,只是要求停顿前后,不要求遍历前后,那么我们之间存一下点与点之间的最短路,之后每次转移一下就可以了。

f[i][S]表示在i节点,状态为S,转移:f[i][S]=max{f[j][S^(1<<i-1)]+dis[i][j]};前后的话,判断一下就可以了,P.S.BZOJ卡时限,**洛谷卡空间

附上代码:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
#define N 20005
#define M 1<<20
struct node
{
int to,next,val;
}e[N*20];
int head[N],cnt,f[(M)+10][21],map[21][21],dis[N],vis[N],g[N],cur[21],n,m,k;
priority_queue <pair<int ,int > >q;
void add(int x,int y,int z)
{
e[cnt].to=y;
e[cnt].next=head[x];
e[cnt].val=z;
head[x]=cnt++;
}
void Dijkstra(int S)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
while(!q.empty())q.pop();
q.push(make_pair(0,S));dis[S]=0;
int num=0;
while(!q.empty())
{
if(num==n)break;
int x=q.top().second;q.pop();
if(vis[x])continue;
vis[x]=1;
num++;
for(int i=head[x];i!=-1;i=e[i].next)
{
int to1=e[i].to;
if(dis[to1]>dis[x]+e[i].val)
{
dis[to1]=dis[x]+e[i].val;
q.push(make_pair(-dis[to1],to1));
}
}
}
for(int i=1;i<=k;i++)map[S-1][i]=dis[i+1];
if(!cur[S-1])f[1<<(S-2)][S-1]=dis[1];
g[S-1]=dis[n];
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
if(!k)
{
Dijkstra(1);
printf("%d\n",dis[n]);
return 0;
}
int Q;
scanf("%d",&Q);
for(int i=1;i<=Q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
cur[y-1]|=(1<<(x-2));
}
memset(f,0x3f,sizeof(f));
for(int i=2;i<=k+1;i++)Dijkstra(i);
for(int S=1;S<1<<k;S++)
{
for(int i=1;i<=k;i++)
{
if(S&(1<<(i-1)))
{
for(int j=1;j<=k;j++)
{
if(!(S&(1<<(j-1)))&&(S&cur[j])==cur[j])
{
f[S|(1<<(j-1))][j]=min(f[S|(1<<(j-1))][j],f[S][i]+map[i][j]);
}
}
}
}
}
int ans=1<<30;
for(int i=1;i<=k;i++)
{
ans=min(ans,f[(1<<k)-1][i]+g[i]);
}
printf("%d\n",ans);
return 0;
}

  

最新文章

  1. springmvc:jsp fmt标签格式化Date时间,格式化后可以用于页面展示
  2. 先定一个小目标,自己封装个ajax
  3. TeamCity : 安装 Server
  4. Nginx location 匹配顺序整理
  5. C#入门随手笔记
  6. Scrum 项目 7.0
  7. [navicat] Navicat for Oracle Cannot load OCI DLL
  8. delphi 在 DragDrop 的时候,滚动 TreeView
  9. JSON格式的各种转换
  10. Linux系统中“动态库”和“静态库”那点事儿
  11. 爬虫入门系列(二):优雅的HTTP库requests
  12. 136. Single Number【LeetCode】异或运算符,算法,java
  13. Swing-JList选择事件监听器ListSelectionListener-入门
  14. java垃圾回收GC
  15. 如何查看安装python和numpy的版本
  16. AD预测论文研读系列2
  17. tkinter学习系列(三)之Label控件
  18. Vuex的学习笔记一
  19. 廖雪峰老师Python3教程练习整理
  20. bzoj千题计划293:bzoj3142: [Hnoi2013]数列

热门文章

  1. MySql导出sql语句
  2. jQuery首页更换背景皮肤
  3. Postman&#160;Postman测试接口之POST提交本地文件数据
  4. nginx www解析失败问题解决
  5. python turtle 绘制图像
  6. docker部署nginx,并实现负载均衡。
  7. TSQL使用ADHOC访问Excle文件
  8. python基础学习10----集合
  9. 【C语言】 使用Beep() 函数 演奏歌曲
  10. 常用js对象、数组、字符串的方法