[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1097

[算法]

首先,用Dijkstra算法求出2-k+1到每个点的最短路

然后,我们用f[S][i]表示目前停留城市集合为S,现在在城市i,最短的路径

状压DP即可

[代码]

#include<bits/stdc++.h>
using namespace std;
#define MAXN 20010
#define MAXM 200010
#define MAXK 25
const int INF = 2e9;
const int MAXS = << ; int i,j,x,n,m,k,u,v,w,tot,g,ts,ans,Mask;
int head[MAXN],s[MAXK];
int dist[MAXK][MAXN],f[MAXS][MAXK];
bool visited[MAXN]; struct Edge
{
int to,w,nxt;
} e[MAXM << ]; inline void addedge(int u,int v,int w)
{
tot++;
e[tot] = (Edge){v,w,head[u]};
head[u] = tot;
}
inline void dijkstra(int s)
{
int i,v,w;
priority_queue< pair<int,int> > q;
pair<int,int> cur;
for (i = ; i <= n; i++)
{
dist[s][i] = INF;
visited[i] = false;
}
dist[s][s] = ;
q.push(make_pair(,s));
while (!q.empty())
{
cur = q.top();
q.pop();
if (visited[cur.second]) continue;
visited[cur.second] = true;
for (i = head[cur.second]; i; i = e[i].nxt)
{
v = e[i].to;
w = e[i].w;
if (dist[s][cur.second] + w < dist[s][v])
{
dist[s][v] = dist[s][cur.second] + w;
q.push(make_pair(-dist[s][v],v));
}
}
}
}
int main()
{ scanf("%d%d%d",&n,&m,&k);
for (i = ; i <= m; i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
scanf("%d",&g);
for (i = ; i <= g; i++)
{
scanf("%d%d",&u,&v);
s[v] |= ( << (u - ));
}
for (i = ; i <= k + ; i++) dijkstra(i);
Mask = ( << k) - ;
for (i = ; i <= Mask; i++)
{
for (j = ; j <= k + ; j++)
{
f[i][j] = INF;
}
}
for (i = ; i <= k + ; i++)
{
if (!s[i])
f[ << (i - )][i] = dist[i][];
}
f[][] = ;
for (i = ; i <= Mask; i++)
{
for (j = ; j <= k + ; j++)
{
for (x = ; x <= k + ; x++)
{
ts = i | ( << (x - ));
if (((s[x] & i) == s[x]) && f[i][j] + dist[j][x] < f[ts][x])
f[ts][x] = f[i][j] + dist[j][x];
}
}
}
ans = INF;
for (i = ; i <= k + ; i++) ans = min(ans,f[Mask][i] + dist[i][n]);
printf("%d\n",ans); return ;
}

最新文章

  1. java IO流 Zip文件操作
  2. 很久以前写的一个 ShareRestrictedSD 类
  3. [译]Dynamics AX 2012 R2 BI系列-Cube概览
  4. java 动态代码生成。
  5. idea
  6. rem vh vw vmin vmax ex ch
  7. EmWin 接触---基础函数
  8. prime docker-compose 环境运行试用
  9. SQL2008配置管理工具服务显示远程过程调用失败
  10. symbolicatecrash App Bug 分析工具
  11. 看见- 柴静-kindle书摘
  12. nginx正向vs反向代理
  13. C# 数组基础
  14. Python进行数据分析—可视化之seaborn
  15. 使用.gitignore忽略文件
  16. poscms用法总结(非定制开发,不涉及后台代码)
  17. 了解一个名词——GTD
  18. solidity语言
  19. SpringBoot---数据缓存(未完待续)
  20. Docker | 第一章:Docker简介

热门文章

  1. DataTable和List相互转换的类
  2. 工厂方法模式(Product)C++实现
  3. 从实现HTML页面局部刷新到JSONP
  4. 最小环 hdu1599 poj1734
  5. nyoj___大数阶乘
  6. https://coderwall.com/p/7smjkq/multiple-ssh-keys-for-different-accounts-on-github-or-gitlab
  7. winserver2012安装.net 3.5
  8. hdu5676 ztr loves lucky numbers(dfs)
  9. Android对手尽皆铩羽,鸿蒙如何绝地求生?
  10. Python笔记6----数组