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 ...
随机推荐
- SQL Server 连接问题-命名管道
原文:SQL Server 连接问题-命名管道 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx 一.前言 ...
- 刷牙LeetCode思考
时间已经到了不自觉地,3在五月中旬.今天正式LeetCode自由181刷牙的问题.感觉,以提高他们的算法非常有帮助. 第一个主要的深搜索,广泛搜索,DP他已经掌握7788.也有自己写的代码格公式,使用 ...
- JavaScript之三:jQuery插件开发(一)
在早期的开发中,正如前面闭包中所提到的那样,人们一开始并没有意识到要开发出插件这么个玩意儿,都是遇到啥写啥.在长期的工作中,人们发现很多代码是重复的,写了一遍又一遍,以登录页面为例,每写一次都需要重新 ...
- 世界上速度最快的输入法 Fleksy 为了支持中国
在 Windows Phone 8.1 内置 Word Flow 宣布取得世界最快输入记录后仅几天就打破的 Fleksy 開始測试中文支持了. 总算有一次创新的输入模式里,中文不是被落下的那个.Fle ...
- EEPlat的元数据驱动的运行引擎
EEPlat採用了元数据驱动的核心思想,因而EEPlat最重要的就是完好的元模型体系及高效灵活的解析运行引擎.EEPlat的运行引擎通过解析基于元模型的元数据,解释运行形成终于的业务系统. EEPla ...
- C++输出IP地址段内的合法地址
近半年的Intel实习生活快要结束了.马上要找工作了,这段时间打算把以前的知识复习复习,顺便在这里记录一下.这是当时去Intel面试的时候,面试官问的一道题.当时因为时间关系,只让我提供一个思路,并没 ...
- OpenGL缓冲区
OpenGL缓冲区 颜色缓冲区 OpenGL时,先是在一个缓冲区中完毕渲染,然后再把渲染结果交换到屏幕上. 我们把这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区.在默认情况下,OpenGL命令是在 ...
- 大数据下的数据分析平台架构zz
转自http://www.cnblogs.com/end/archive/2012/02/05/2339152.html 随着互联网.移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海 ...
- Testin一日游实验室发布的行级APP质量报告:在那里拍携程双赢
Testin实验室公布国庆出行旅途类APP质量报告:携程力压去哪儿夺冠 2014/09/28 · Testin · 实验室报告 一年一度的十一黄金周即将临近,旅游软件成为每外出行人手机必装软件.为此全 ...
- Ubuntu 14.04 LAMP搭建(Apache 2.47+MySQL 5.5+PHP5.5)
原文:Ubuntu LAMP搭建 为了数据库课程设计,只好自己搭一个数据库系统,采用LAMP方式. 一.安装 1.安装Apache sudo apt-get install apache2 Apach ...