初涉A*剪枝
挖坑防忘,天亮补题解。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map> #pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long LL
#define _LL __int64
#define _INF 0x3f3f3f3f
#define Mod 1000000007 using namespace std; const int MAXN = 100100; struct N
{
int u,v,w,next,ty;
}edge[2*MAXN]; int head[MAXN]; int Top; void Link(int u,int v,int w,int ty)
{
edge[Top].ty = ty;
edge[Top].v = v;
edge[Top].w = w;
edge[Top].next = head[u];
head[u] = Top++;
} int ans[1010]; int w[1010][1010]; int H[1010]; struct Q
{
int v,g,h,f;
bool operator < (const Q &a) const
{
return a.f < f;
}
}; void Init_H(int t)
{
Q s,f;
s.f = 0;
s.v = t; memset(H,-1,sizeof(H));
H[t] = 0; priority_queue<Q> q;
q.push(s); while(q.empty() == false)
{
f = q.top();
q.pop(); H[f.v] = (H[f.v] == -1 ? f.f : H[f.v]); for(int p = head[f.v]; p != -1; p = edge[p].next)
{
if(edge[p].ty == 2)
{
if(H[edge[p].v] == -1)
{
s.v = edge[p].v;
s.f = f.f + edge[p].w;
q.push(s);
}
}
}
}
} void bfs(int h,int e,int k)
{
Q f,s;
priority_queue<Q> q;
f.g = 0;
f.h = H[h];
f.f = f.h + f.g;
f.v = h; q.push(f); while(q.empty() == false)
{
f = q.top();
q.pop(); if(f.g != 0)
{
w[f.v][++ans[f.v]] = f.g; if(f.v == e && ans[f.v] == k)
return ;
} for(int p = head[f.v]; p != -1; p = edge[p].next)
{
if(edge[p].ty == 1)
{
s.v = edge[p].v;
s.h = H[edge[p].v];
s.g = f.g + edge[p].w;
s.f = s.h + s.g;
q.push(s);
}
} } } int main()
{ int n,m; int u,v,ww,i; while(scanf("%d %d",&n,&m) != EOF)
{
memset(head,-1,sizeof(head)); Top = 0; for(i = 0;i < m; ++i)
{
scanf("%d %d %d",&u,&v,&ww);
Link(u,v,ww,1);
Link(v,u,ww,2);
} int s,t,k; scanf("%d %d %d",&s,&t,&k); Init_H(t); memset(ans,0,sizeof(ans)); bfs(s,t,k); if(ans[t] < k)
{
printf("-1\n");
}
else
{
printf("%d\n",w[t][k]);
} }
return 0;
}
初涉A*剪枝的更多相关文章
- α-β剪枝算法的java语言实现(非常实用)
利用α-β剪枝算法,对下图所示的博弈树进行搜索,搜索得到根节点选择的走步,以及没有必要进行评估的节点,并求出给出在何处发生了剪枝,以及剪枝的类型(属于α剪枝还是β剪枝). 注:□表示MIN节点:○表示 ...
- Sicily 1153: 马的周游问题(DFS+剪枝)
这道题没有找到一条回路,所以不能跟1152一样用数组储存后输出.我采用的方法是DFS加剪枝,直接DFS搜索会超时,优化的方法是在搜索是优先走出度小的路径,比如move1和move2都可以走,但是如走了 ...
- HDU5887 Herbs Gathering(2016青岛网络赛 搜索 剪枝)
背包问题,由于数据大不容易dp,改为剪枝,先按性价比排序,若剩下的背包空间都以最高性价比选时不会比已找到的最优解更好时则剪枝,即 if(val + (LD)pk[d].val / (LD)pk[d]. ...
- HDU5937 Equation(DFS + 剪枝)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5937 Description Little Ruins is a studious boy, ...
- alpha-beta剪枝搜索
•一种基于剪枝( α-βcut-off)的深度优先搜索(depth-first search). •将走棋方定为MAX方,因为它选择着法时总是对其子节点的评估值取极大值,即选择对自己最为有利的着法: ...
- POJ1190生日蛋糕[DFS 剪枝]
生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18236 Accepted: 6497 Description ...
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU1010 DFS+剪枝
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- HDU 5113 dfs剪枝
题意:告诉格子规格,颜色个数,以及每个颜色能涂得格子数目,问是否能够实现相邻两个格子的颜色数目不相同. 分析:因为数据很小,格子最多是5 * 5大小的,因此可以dfs.TLE了一次之后开始剪枝,31m ...
随机推荐
- POJ2301+水~~~~~~
有比这更水的么.............. #include<stdio.h> int main(){ int n; scanf("%d",&n); while ...
- mac 浏览器 强刷快捷键
windows 浏览器的刷新快捷键F5,强制刷新Ctrl+F5 Mac 系统下浏览器的刷新快捷键 command+R, 强制刷新快捷键为 command+shift+R
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-008-SpEL介绍
一. 1.SpEL expressions are framed with #{ ... } 2.SpEl的作用 Sp EL has a lot of tricks up its sleeves, ...
- MySQL 5.6数据库配置主从同步
win7环境下mysql主从搭建 我下载的是压缩包,免安装的那种 1.简单安装 解压后把my-default.ini复制一份改为my.ini默认mysql会找这个文件,首先从system32下找,然后 ...
- BMS 项目过程中遇到的问题
环境搭建的问题 Git的ssh私人密钥问题, 路劲不正确的话使用ssh方式连接github进行远程push或clone会出现需要输入密码而怎么输入都不正确的情况,这个时候使用下面的办法: http方面 ...
- hdu4323Magic Number(dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4323 去年的多校 编辑距离的变形 暴力居然过了 还想了好久别的方法,想得很头疼 #include <ios ...
- hadoop面试时可能遇到的问题
面试hadoop可能被问到的问题,你能回答出几个 ? 1.hadoop运行的原理? 2.mapreduce的原理? 3.HDFS存储的机制? 4.举一个简单的例子说明mapreduce是怎么来运行的 ...
- POJ 1860 Currency Exchange + 2240 Arbitrage + 3259 Wormholes 解题报告
三道题都是考察最短路算法的判环.其中1860和2240判断正环,3259判断负环. 难度都不大,可以使用Bellman-ford算法,或者SPFA算法.也有用弗洛伊德算法的,笔者还不会SF-_-…… ...
- javascript二维数组
var a= new Array(new Array(1,2),new Array('b','c')); document.write(a[1][1]); 说白了,就是利用for循环定义二维数组! & ...
- html input设置为只读属性
有两种方式可以实现input的只读效果:disabled 和 readonly. 自然两种出来的效果都是只能读取不能编辑,可是两者有很大不同. Disabled说明该input无效,及其value不会 ...