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 ...
随机推荐
- Nginx搭建反向代理服务器过程详解(转)
一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...
- nginx 提供静态内容
Serving Static Content 提供静态内容 原文地址:http://nginx.com/resources/admin-guide/serving-static-content/ Th ...
- zoj-3795-Grouping-tarjan确定最长的公路收缩
使用tarjan缩合点. 然后,dfs寻找最长的公路. 水体. . . #include<stdio.h> #include<string.h> #include<alg ...
- php用空格代替标点符号
php作为常规赛的符号替换为空格 <? php $character = "!@#$%^&*于'纸'纸'文().,<>|[]'\":;}{-_+=? /a ...
- 一键安装 gitlab7 on rhel6.4 并设置邮件发送
一键安装 gitlab7 on rhel6.4 并设置邮件发送 世间本无事,庸人自扰之.书归正传,简短节说:gitlab是个好东西,可是安装手冊奇烂.尽管以前对比文档一步一步安装起来gitlab 6. ...
- 有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)
引用 前几天在网上看到一个淘宝的面试题:有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果.一:分析题目 从题中可以看到“很大的List”以及“ ...
- (大数据工程师学习路径)第四步 SQL基础课程----其他(基础练习到此为止)
一.准备 在正式开始本内容之前,需要先从github下载相关代码,搭建好一个名为mysql_shiyan的数据库(有三张表:department,employee,project),并向其中插入数据. ...
- UOJ #5. 【NOI2014】动物园 扩大KMP
第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比 ...
- 于 jsp第横梁list数据
往往我们都会将查询到的数据显示到界面中,那么该怎样在界面显示.请看以下的具体解释: 0)前提得在jsp页面中获取后台传过来的数据(在此为List集合): ...
- Oracle 修改字符集
出现ORA-12899,是字符集引起的,中文在UTF-8中占3个字节,ZHS16GBK中占2个字节,而源dmp文件字符集是ZHS16GBK库里倒出来的数据,现在要导入到目标字符集为UTF-8的库里,所 ...