题目来源:Light OJ 1316 1316 - A Wedding Party

题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路

思路:首先预处理每两点之前的最短路 然后仅仅考虑那些商店 个数小于15嘛 就是TSP问题 状态压缩DP搞一下 状态压缩姿势不正确 有必要加强

#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 510;
const int maxm = 16;
const int INF = 999999999;
struct edge
{int u, v, w;edge(){}edge(int u, int v, int w): u(u), v(v), w(w) {}
};struct HeapNode
{int u, dis;HeapNode(){};HeapNode(int u, int dis): u(u), dis(dis){}; bool operator < (const HeapNode& rhs)const{return dis > rhs.dis;}
};
vector <edge> G[maxn];
int d[maxn][maxn];
int dp[1<<maxm][maxm];
bool vis[maxn];
int n, m, t;
int a[maxm];
void Dijkstra(int s)
{for(int i = 0; i <= n; i++)d[s][i] = INF;d[s][s] = 0;memset(vis, false, sizeof(vis));priority_queue <HeapNode> Q;Q.push(HeapNode(s, 0));while(!Q.empty()){HeapNode x = Q.top();Q.pop();int u = x.u;if(vis[u])continue;vis[u] = true;for(int i = 0; i < G[u].size(); i++){     edge e = G[u][i];int v = e.v;if(d[s][v] > x.dis + e.w){d[s][v] = x.dis + e.w;Q.push(HeapNode(v, d[s][v]));    }}}
}
int get(int x)
{int ans = 0;while(x){if(x&1)ans++;x >>= 1;}return ans;
}
int main()
{   int T;int cas = 0;scanf("%d", &T);while(T--){scanf("%d %d %d", &n, &m, &t);for(int i = 0; i <= n; i++)G[i].clear();    for(int i = 0; i < t; i++){int x;scanf("%d", &x);a[i] = x;}for(int i = 0; i < m; i++){int u, v, w;scanf("%d %d %d", &u, &v, &w);  G[u].push_back(edge(u, v, w));}for(int i = 0; i < n; i++)Dijkstra(i);for(int s = 0; s < (1<<t); s++){for(int i = 0; i < t; i++){dp[s][i] = INF;if(!(s&(1<<i)))continue;if(s == (1<<i)){//if(s == 2 && i == 1)//    printf("%d\n", d[0][a[i]]);dp[s][i] = d[0][a[i]];continue;}for(int j = 0; j < t; j++){if((s&(1<<j)) && (i != j)){if(dp[s^(1<<i)][j] == INF)continue;if(d[a[j]][a[i]] == INF)continue; //if(s == 3 && i == 0)//    printf("%d %d %d %d\n", dp[s^(1<<i)][j], d[a[j]][a[i]], j, dp[2][1]);dp[s][i] = min(dp[s^(1<<i)][j] + d[a[j]][a[i]], dp[s][i]);}}}}//printf("222*%d\n", dp[3][0]);int x;int ans = INF, sum = 0;for(int s = 1; s < (1<<t); s++){for(int i = 0; i < t; i++){    //if(s == (1<<i))// printf("***%d %d %d\n", dp[s][i], i, s);//printf("**%d %d %d %d\n", dp[s][i], s, i, dp[2][i]);if(dp[s][i] == INF || d[a[i]][n-1] == INF)continue;int temp = get(s);if(sum < temp || sum == temp && ans > dp[s][i]+d[a[i]][n-1]){sum = temp;ans = dp[s][i]+d[a[i]][n-1];x = s;}}}if(sum == 0){printf("Case %d: Impossible\n", ++cas);continue;}printf("Case %d: %d %d\n", ++cas, sum, ans);}return 0;
}

Light OJ 1316 A Wedding Party 最短路+状态压缩DP相关推荐

  1. HDU Victor and World (最短路+状态压缩)

    题目链接:传送门 题意: n个城市m条路.刚開始在点1,求把每一个城市都遍历一边最后回到1的花费的最小值. 分析: 我们首先须要预处理出随意两个国家之间的最短距离.由于数据范围非常小,所以直接用Flo ...

  2. 【上海交大oj】畅畅的牙签袋(状态压缩dp)

    1383. 畅畅的牙签袋 题目描述 畅畅说:"你们都说窝脑子瓦特了,我看你们才是脑子瓦特嘞- -" 为了阻挠我们再次揭露他的无chǐ,畅畅妄图破坏我们的显示器,他拿出了自己收集的牙 ...

  3. 【算法学习笔记】67.状态压缩 DP SJTU OJ 1383 畅畅的牙签袋

    思想来自:http://blog.pureisle.net/archives/475.html 主要思想是用1和0来表示是否被填,然后根据两行之间的状态关系来构建DP方程. 1.首先初始化第一行 计算 ...

  4. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问 ...

  5. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  6. 最短路计数(dp+最短路)

    Description 给出一个 n 个顶点 m 条边的无向无权图,顶点编号为 1 到 n. 问从顶点 1 开始,到其他每个点的最短路有几条. Input 第一行 2 个正整数 n, m  ( 1 ≤ ...

  7. YYHS-蜀传之单刀赴会(梦回三国系列T2)(最短路+状压dp)

    题目描述 [题目背景] 公元215年,刘备取益州,孙权令诸葛瑾找刘备索要荆州.刘备不答应,孙权极为恼恨,便派吕蒙率军取长沙.零陵.桂阳三郡.长沙.桂阳蜀将当即投降.刘备得知后,亲自从成都赶到公安(今湖 ...

  8. Light OJ - 1008 - Fibsieve`s Fantabulous Birthday 题解

    就是计算特殊长方形坐标的问题,这类题目需要的是细心,细心,再细心,然后推导摸索出公式来, 题目如下: Fibsieve had a fantabulous (yes, it's an actual w ...

  9. light oj 1011Marriage Ceremonies

    总结状压dp板子. 强迫症预处理,多写了几行但非常快 #include<cstdio> #include<cstring> #include<algorithm> ...

最新文章

  1. 程序员硬核“年终大扫除”,清理了数据库 70GB 空间
  2. network-manager
  3. 【数据挖掘】K-Means 二维数据聚类分析 ( K-Means 迭代总结 | K-Means 初始中心点选择方案 | K-Means 算法优缺点 | K-Means 算法变种 )
  4. 删除同域名所有cookies_淘宝自动登录2.0,新增Cookies序列化
  5. 服务器raid卡装虚拟机,DELLR730服务器阵列卡配置、VMware安装、WIN2008安装.docx
  6. 二十八、深入浅出Python中的 logging模块
  7. android 6.0权限
  8. Quartus16.0如何使用TCL脚本
  9. python提取英文单词 每行显示一个_使用python对文件中的单词进行提取
  10. java中el是什么_java中jsp的EL的定义以及使用
  11. Keras 中的循环神经网络 (RNN)
  12. HDUOJ3549 - Flow Problem(网络流+最大流最小割+模板)
  13. 【今日所得】1.29。。。
  14. Mvc 翻页查询,代码很有用
  15. LidarSLAM(三):EVO- SLAM轨迹精度评价工具
  16. Linux的磁盘分区、基本目录结构
  17. ESP-iSYS数据库(实时数据库),API使用
  18. mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?
  19. 多路复用之——epoll
  20. 计算机应用基础课程整体设计说课视频,关于计算机应用基础课程说课设计.doc...

热门文章

  1. m苹果放n篮子_能用一只手,我绝对不用一双:苹果试图解锁更多Apple Watch控制手势...
  2. C语言如何交换两个数(位运算)
  3. 西门子uss通讯实例_西门子plc1200系列的功能特点有哪些?
  4. python从大到小排序_python作业:用嵌套的列表存储学生成绩数据,并编程完成如下操作...
  5. go中select用法详解
  6. 辰皇怎么过鸿蒙,诛仙3职业全面解析 各职业副本优缺点介绍
  7. android的动态注册,Android JNI 函数注册的两种方式(静态注册/动态注册)
  8. java 正则比大小_Java:正则表达式模式匹配器是否有大小限制? - java
  9. VSCode Editing Code
  10. pytorch torch.nn.Embedding