Light OJ 1316 A Wedding Party 最短路+状态压缩DP
题目来源: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的更多相关文章
- 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...
- Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖
题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...
- POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)
题意:类似于TSP问题,只是每个点可以走多次,求回到起点的最短距离(起点为点0). 分析:状态压缩,先预处理各点之间的最短路,然后sum[i][buff]表示在i点,状态为buff时所耗时...... ...
- 2010辽宁省赛E(Bellman_Ford最短路,状态压缩DP【三进制】)
#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;struct node{ int v,z,d, ...
- HDU Victor and World (最短路+状态压缩)
题目链接:传送门 题意: n个城市m条路.刚開始在点1,求把每一个城市都遍历一边最后回到1的花费的最小值. 分析: +n2∗2n). 转自Bestcode. 以下说说我的状态转移,首先 ...
- Light oj 1099 - Not the Best 次短路
题目大意:求次短路. 题目思路:由于可能存在重边的情况所以不能采用邻接矩阵储存图,我用了邻接表来存图. 由起点S到终点E的次短路可能由以下情况组成: 1.S到v点的次短路 + v到E的距离 2.S到v ...
- Light OJ 1037 - Agent 47(预处理状态压缩DP)
题目大意: 有个特工要执行任务,他会遭遇到最多15个目标,特工必须把他们全部杀死.当他杀死一个目标后他可以使用目标的武器来杀死其他人.因此他必须有一个杀人的顺序,使得他开枪的次数最小. 现在给你一个表 ...
- Light OJ 1021 - Painful Bases(状态压缩DP)
题目大意: 给你一个base 进制的数字,把这个数字的每一位进行全排列,问有多少个数字是可以整除k的. 题目解析: #include<cstdio> #include<cstring ...
- light oj 1151 - Snakes and Ladders 高斯消元+概率DP
思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...
随机推荐
- uva10954 - Add All(multiset功能)
题目:10954 - Add All 题目大意:求n个数的和,可是有点不一样的是题目要求计算最少花费.每次两个数相加,得到的那个数就是每次计算的cost. 解题思路:之前没有想到用multiset,自 ...
- Java Web整合开发(16) -- Struts 2.x 概述
Struts2与Spring的整合 •Struts2框架为配合与Spring3框架进行整合,提供了相应的拦截器. •该组件名为StrutsSpringObjectFactory,位于struts2-s ...
- HDU3549 Flow Problem 【最大流量】
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- 软测试综述——PV操作
在操作系统中,进程之间常常会存在相互排斥(都须要共享独占性资源时)和同步(完毕异步的两个进程的协作)两种关系.而信号量和PV操作完美有效的处理了这两种情况. 相互排斥:就好比过独木桥,一 ...
- 基于hadoop的电影推荐结果可视化
数据可视化 1.数据的分析与统计 使用sql语句进行查询,获取所有数据的概述,包括电影数.电影类别数.人数.职业种类.点评数等. 2.构建数据可视化框架 这里使用了前端框架Bootstrap进行前端的 ...
- IOS计划 分析
1.基本介绍 IOS苹果公司iPhone.iPod touch和iPad操作系统和其他设备的发展. 2.知识点 1.IOS系统 iPhone OS(现在所谓的iOS)这是iPhone, iPod to ...
- 五个项目管理学习笔记.沟通技巧II
两.通信模型:沟通的双向过程 沟通模型: 编 码---------------->信息-----------------> 解码&歧义 发送者 ...
- HDU 2120 Ice_cream's world I(并检查集合)
职务地址:HDU 2120 这题尽管字数不多,但就是看不懂. . 意思是求最多有多少个被墙围起来的区域.显然就是求环的个数.然后用并查集求环个数就能够了. 代码例如以下: #include <i ...
- C++定义自己的命名空间和头文件
下面的例子演示如何使用一个简单的演示空间和自己的头文件定义.码如下面: compare.h: namespace compare{ double max(const double* data,int ...
- linux安装和配置 mysql、redis 过程中遇到的问题记录(转)
章节目录 mysql redis linux下部署mysql和redis网上的教程很多,这里记录一下我部署.配置的过程中遇到的一些问题和解决办法. mysql ①安装完成后启动的时候报错 Starti ...