2010辽宁省赛E(Bellman_Ford最短路,状态压缩DP【三进制】)
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
struct node
{
int v,z,d,next;//存可以连接的点,用next存邻接表
}a[10010];
struct road
{
int u,cnt,dis;//dis储存当前需要的钱数,即最短路算法里的权,u储存顶点,cnt储存组合数即状态压缩dp
road(int uu,int cntt,int diss)
{
u=uu;
cnt=cntt;
dis=diss;
}
bool operator < (const road &x)const
{
return dis>x.dis;//将费用小的放在前面
}
};
int first[110],co1[110],co2[110],employ[10],d[110][20000],re[10];//re储存传话人物的使用次数
int n,m,cc,len;
void bellman_ford()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<employ[m];j++)
{
d[i][j]=inf;//初始化
}
}
d[0][0]=0;
priority_queue<road>q;
q.push(road(0,0,0));
while(!q.empty())
{
road qq=q.top();
q.pop();
if(qq.dis>d[qq.u][qq.cnt])//已经是更优的解,无需松弛
continue;
if(qq.u==n-1)//松弛到达n-1
{
printf("%d\n",qq.dis);
return;
}
for(int i=first[qq.u];i!=-1;i=a[i].next)//搜寻邻接表
{
int tmp=qq.cnt;
for(int j=0;j<m;j++)//更新每一个employee在这条路上的使用次数
{
re[j]=tmp%3;
tmp/=3;
}
int v=a[i].v;
int z=a[i].z;
int cost=a[i].d;
int t=1;
if(re[z]==1)
{
cost+=co1[z];
}
else if(re[z]==2)
{
cost+=co2[z];
t=0;
}
if(d[v][qq.cnt+t*employ[z]]>qq.dis+cost)//最短路算法的核心
{
d[v][qq.cnt+t*employ[z]]=qq.dis+cost;
q.push(road(v,qq.cnt+t*employ[z],d[v][qq.cnt+t*employ[z]]));
}
}
}
printf("-1\n");
}
void add_edge(int u,int v,int z,int d)
{
a[len].v=v;
a[len].z=z;
a[len].d=d;
a[len].next=first[u];
first[u]=len++;
}
int main()
{
employ[0]=1;
for(int i=1;i<=9;i++)
{
employ[i]=3*employ[i-1];//初始化
}
while(~scanf("%d%d%d",&n,&m,&cc))
{
memset(first,-1,sizeof(first));
for(int i=0;i<m;i++)
{
scanf("%d",&co1[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d",&co2[i]);
}
len=0;
int x,y,z,d;
for(int i=0;i<cc;i++)
{
scanf("%d%d%d%d",&x,&y,&z,&d);
add_edge(x,y,z,d);
}
bellman_ford();//可以求负权的最短路算法
}
return 0;
}
//思路仍待跟进
bellman的核心代码只有4行
for(int k=1;k<=n-1;k++)//进行n-1次松弛
for(int i=1;i<=m;i++)//枚举每一条边
if(dis[v[i]]>dis[u[i]]+w[i])//尝试松弛每一条边
dis[v[i]]=dis[u[i]]+w[i];
这个算法也是遍历n-1遍找过所有的点,至于为什么是n-1呢。dijs算法n-1次遍历是因为有n-1个点需要遍历,这个也是因为最短路是一个不包含回路的路径,无论正负权回路都不能有,那么去掉回路,n个点任意两点之间就最多有n-1条边。但是程序可能在不到n-1次循环就已经找到了所有最短路,说明这个是最坏情况下是n-1次遍历。
dis同样是存在起始点到各个顶点的最短路,这个与dijs不同的是,dijs每次找到最近的点进行松弛操作,而这个bellman则是只要路程更短我就松弛。也是因为这样才能用来解决负权值问题。
那么怎么来看有负权值回路呢,如果有负权值回路,那最短路就不会存在,因为最短路会越来与小。那么在n-1轮松弛后,要是还能松弛就代表有负权值回路。
2010辽宁省赛E(Bellman_Ford最短路,状态压缩DP【三进制】)的更多相关文章
- HDU 3001 Travelling(状态压缩DP+三进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...
- Light OJ 1316 A Wedding Party 最短路+状态压缩DP
题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...
- 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...
- POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)
题意:类似于TSP问题,只是每个点可以走多次,求回到起点的最短距离(起点为点0). 分析:状态压缩,先预处理各点之间的最短路,然后sum[i][buff]表示在i点,状态为buff时所耗时...... ...
- 2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版
2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP 题目描述 蓝桥学院由21栋教学楼组成,教学楼编号1到21.对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通 ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- HDU 3681 Prison Break(状态压缩dp + BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...
- [转]状态压缩dp(状压dp)
状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...
- BFS+状态压缩DP+二分枚举+TSP
http://acm.hdu.edu.cn/showproblem.php?pid=3681 Prison Break Time Limit: 5000/2000 MS (Java/Others) ...
随机推荐
- hbase_异常_02_hbase无法访问16010端口
一.异常现象 上一个异常解决了之后,已经能正常启动hbase了,也能正常使用hbase shell ,但是无法通过浏览器访问 16010端口. 二.异常原因 1.原因一 hbase 1.0 以后的版 ...
- 启用Linux云平台oracle数据库实口令复杂性函数:PASSWORD_VERIFY_FUNCTION=NULL
第一步:采用putty.exe登录数据库服务器. 输入IP后点击“Open”按钮: 第二步:登录对应的数据库实例. 执行:# su – oracle 查找:$ps -ef | grep pmon 找到 ...
- ACM学习历程—广东工业大学2016校赛决赛-网络赛F 我是好人4(数论)
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=5 这个题目一看就是一道数论题,应该考虑使用容斥原理,这里对lcm进行容斥. ...
- Django中的事务(Transaction)管理
Django默认的事务行为 默认情况下,在Django中事务是自动提交的.当我们运行Django内置的模板修改函数时,例如调用model.save()或model.delete()时,事务将被立即提交 ...
- bzoj 3083 遥远的国度 —— 树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 换根后路径还是不变,子树分类讨论一下,树剖后线段树维护即可. 代码如下: #inclu ...
- HDOJ1114(完全背包)
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const ...
- JVM插庄之二:Java agent基础原理
javaagent 简介 Javaagent 只要作用在class被加载之前对其加载,插入我们需要添加的字节码. Javaagent面向的是我们java程序员,而且agent都是用java编写的,不需 ...
- svn、git等比较---总结
免费的版本控制系统: CVS:集中式的版本控制系统,必须联网,速度慢,CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用.由于CVS自身设计的问题,会造成提交文件不完整,版本库莫 ...
- Centos7搭建pptp
废话不多说,先上脚本地址:Centos7一键pptp 使用方法: wget https://raw.githubusercontent.com/DanylZhang/VPS/master/CentOS ...
- C语言学习笔记--enum和sizeof关键字
1.enum关键字 C语言中enum关键字用来定义枚举类型 (1)enum 是 C 语言中的一种自定义类型(2)enum 值是可以根据需要自定义的的整型值(3)第一个定义的 enum 值默认为 0 ( ...