loj 1316(spfa预处理+状压dp)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024
题意:求0-(n-1)的经过最多的标记的点的最短路。
思路:首先我们可以spfa预处理出起点到标记的最短距离,标记的点到终点的最短距离,然后就是状压dp了,dp[state][u]表示在该状态下到达点u的最短路径。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define MAXN 555
#define FILL(a,b) memset(a,b,sizeof(a))
#define inf 1<<30 struct Edge{
int v,w;
Edge(int vv,int ww):v(vv),w(ww){}
}; int n,m,s,bit[<<];
int Initiate(int state)
{
int cnt=;
while(state){
cnt+=state&;
state>>=;
}
return cnt;
} int dist[][MAXN],pos[];
bool mark[MAXN];
vector<Edge>g[MAXN]; bool spfa(int vs,int dist[])
{
fill(dist,dist+n,inf);
FILL(mark,false);
queue<int>que;
que.push(vs);
dist[vs]=;
while(!que.empty()){
int u=que.front();
que.pop();
mark[u]=false;
for(int i=;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(dist[u]+w<dist[v]){
dist[v]=dist[u]+w;
if(!mark[v]){
mark[v]=true;
que.push(v);
}
}
}
}
return dist[n-]!=inf;
} int dp[<<][],ans1,ans2;
void Get_Dp()
{
for(int i=;i<=(<<s);i++)
for(int j=;j<=s;j++)dp[i][j]=inf;
for(int i=;i<s;i++){
int p=pos[i];
spfa(p,dist[i]);
dp[<<i][i]=dist[s][p];
}
ans1=;
ans2=dist[s][n-];
for(int state=;state<(<<s);state++){
int tmp=bit[state];
for(int i=;i<s;i++)if(state&(<<i)){
if(dist[i][n-]!=inf&&dp[state][i]!=inf){
if(tmp>ans1)ans1=tmp,ans2=dp[state][i]+dist[i][n-];
else if(tmp==ans1)ans2=min(ans2,dp[state][i]+dist[i][n-]);
for(int j=;j<s;j++)if(!(state&(<<j))){
dp[state|(<<j)][j]=min(dp[state|(<<j)][j],dp[state][i]+dist[i][pos[j]]);
}
}
}
}
printf("%d %d\n",ans1,ans2);
} int main()
{
int _case,t=;
scanf("%d",&_case);
for(int i=;i<=(<<);i++)bit[i]=Initiate(i);
while(_case--){
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=n;i++)g[i].clear();
for(int i=;i<s;i++)scanf("%d",&pos[i]);
while(m--){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u].push_back(Edge(v,w));
}
printf("Case %d: ",t++);
if(!spfa(,dist[s])){
puts("Impossible");
continue;
}
Get_Dp();
}
return ;
}
loj 1316(spfa预处理+状压dp)的更多相关文章
- hdu 4568 Hunter(spfa预处理 + 状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...
- UVA 1412 Fund Management (预处理+状压dp)
状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态.但是这样做用数组开不下,用map离散会T. 而实际上很多九进制数很多都是用不上的.因此类似uva 1601 Mornin ...
- loj#10172 涂抹果酱 (状压DP)
题目: #10172. 「一本通 5.4 练习 1」涂抹果酱 解析: 三进制的状压DP 经过简单的打表发现,在\(m=5\)时最多有\(48\)种合法状态 然后就向二进制一样枚举当前状态和上一层的状态 ...
- UVa 1412 Fund Management (预处理+状压DP)
题意:题意很难说清楚自己看原文,链接:UVa 1412 Fund Management 析:总体来说如果没有超时的话,这个题不是特别难,但是这个题很容易超时,主要是体现在状态转移时,很容易想到状态方程 ...
- codevs2800送外卖(floyd+状压dp)
2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- 【BZOJ-1097】旅游景点atr SPFA + 状压DP
1097: [POI2007]旅游景点atr Time Limit: 30 Sec Memory Limit: 357 MBSubmit: 1531 Solved: 352[Submit][Sta ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...
随机推荐
- jdbc事务处理和连接池
JDBC: * JDBC概念:Java DataBase Connectivity(Java数据库连接) SUN公司提供的一组连接数据库API. * JDBC开发步骤: * 1.注册驱动. * 2.获 ...
- oracle11g 连接问题
一.The Network Adapter could not establish the connection 状态: 失败 -测试失败: IO 错误: The Network Adapter c ...
- MySQL中的增删改查
将表cm_application中的state字段类型改为字符串型 alter table cm_application modify STATE varchar(50); 将表cm_applic ...
- Kafka单机环境部署
前面说过Kafka集群环境的部署,现在主要说一下在本地测试中Kafka单机环境的部署,和前面一样首先保证zookeeper服务的正常运行,然后解压并释放kafka安装包,并放到指定位置: tar -x ...
- Effective C++ -----条款17:以独立语句将newed对象置入智能指针
以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露.
- CentOS7 win7 u盘装双系统 修复系统
环境: ASUS MB VER K45VD 笔记本电脑一台( i5-3230M 处理器. SATA . Nvidia). Windows7 系统 在 win7 下安装 CentOS7 使用 Ultra ...
- Tomcat中文乱码问题的原理和解决方法
1) 更改 D:\Tomcat\conf\server.xml,指定浏览器的编码格式为“简体中文”: 方法是找到 server.xml 中的 <Connector port="8080 ...
- 【QT】自己生成ui加入工程
在三个月前 我就在纠结 C++ GUI Qt 4编程这本书中2.3节 快速设计对话框这一段. 按照书上的做没有办法生成能够成功运行的程序. 这两天又折腾了好久,终于成功了. 注意事项: 1. 我之前装 ...
- Jquery网站下雪花的效果
代码如下: <script type="text/javascript" src="jquery.min.js"></script> & ...
- sql 查询最近30分钟或者自定义时间数据
) FROM dual; 30分钟或者自定义