初涉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 ...
随机推荐
- POJ2200+全排列模拟
简单. 手动的实现全排列 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<a ...
- android ExpandableListActivity的使用
package com.example.keKuoZhanLieBiao; import android.app.ExpandableListActivity; import android.os.B ...
- MongoDB实战指南(二):索引与查询优化
数据库保存记录的机制是建立在文件系统上的,索引也是以文件的形式存储在磁盘上,在数据库中用到最多的索引结构就是B树.尽管索引在数据库领域是不可缺少的,但是对一个表建立过多的索引会带来一些问题,索引的建立 ...
- 一个CLI的 的例子
1)这是CLI 调用HTTPOST例子 #using <System.dll> using namespace System;using namespace System::Net;usi ...
- JavaScript实现命令行交互
原文地址: http://www.cnblogs.com/liaoyu/p/js-terminal.html 周末闲着想试试用 JavaScript 模拟命令行交互的功能,希望达到的几个功能点如下: ...
- 【HDOJ】3652 B-number
终于自己写出来一道数位DP啊.继续训练DP. /* 3652 */ #include <iostream> #include <sstream> #include <st ...
- 利用逻辑运算符?"三个数字比大小
static void Main(string[] args) { int a, b, c; while (true) ...
- bzoj2738
感人肺腑pascal过不去系列,跪求开O2先不说这个了,学完cdq分治之后又顺手学了一下整体二分感觉这两个东西很多相似的地方,干脆都叫cdq分治好了二分解决k小就是设当前二分的答案为m,把x<= ...
- Linux Kernel本地权限提升漏洞
漏洞版本: Linux Kernel 漏洞描述: Bugtraq ID:64291 CVE ID:CVE-2013-6368 Linux Kernel是一款开源的操作系统. 如果用户空间提供的vapi ...
- bat中的连接符
& [...] command1 & command2 用来分隔一个命令行中的多个命令.Cmd.exe 运行第一个命令,然后运行第二个命令. && [...] comm ...