HDU 5118 GRE Words Once More!(搜索剪枝)
来源:互联网 发布:kali windows 编辑:程序博客网 时间:2024/06/04 19:26
题意:
给定一个有无环图,边权代表一个字母(事实上用数字表示的),然后给定2~n个点的特殊性,1表示特殊,0表示不特殊,从1出发,到一个特殊点停止,这条路径上的所有字母拼成一个单词,将所有单词按照字典序排序后,然后Q组询问,问第k个单词的长度是多少。
思路:
参考自:http://blog.csdn.net/yuanjunlai141/article/details/73744137
DFS暴力记录1e8个单词的长度(ML:512MB)
剪枝:
由于每个点后对应的单词数量是一定的,当遇到已访问的点时,复制点后的单词后直接return即可。
注意单词的长度的变化即可。
代码:
#include <bits/stdc++.h>using namespace std;const int MAXN=1e5+10;const int MAXM=1e8+10;int n,m,q;int marked[MAXN],dep[MAXN];int ans[MAXM+1],ppp,loc[MAXN],cnt[MAXN];typedef struct Node{ int x; int val; bool operator < (const Node &a){ return val<a.val; }}Node;vector <Node> son[MAXN];void dfs(int pos,int depth){ if(ppp<MAXM){ if(!dep[pos]){ dep[pos]=depth; loc[pos]=ppp; if(marked[pos]){ ans[++ppp]=depth; cnt[pos]++; } int len=son[pos].size(); for(int i=0;i<len;i++) dfs(son[pos][i].x,depth+1),cnt[pos]+=cnt[son[pos][i].x]; }else{ for(int i=loc[pos]+1;i<=(loc[pos]+cnt[pos])&&ppp<MAXM;i++) ans[++ppp]=ans[i]-dep[pos]+depth; } }}int main(){ int T,x,y,z; scanf("%d",&T); for(int Case=1;Case<=T;Case++){ scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=n;i++) son[i].clear(); memset(dep,0,sizeof(dep)); memset(cnt,0,sizeof(cnt)); for(int i=2;i<=n;i++) scanf("%d",&marked[i]); for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); son[x].push_back({y,z}); } for(int i=1;i<=n;i++) sort(son[i].begin(),son[i].end()); ppp=0;dfs(1,0); printf("Case #%d:\n",Case); for(int i=0;i<q;i++){ scanf("%d",&x); printf("%d\n",x<=ppp?ans[x]:-1); } }}
阅读全文
0 0
- HDU 5118 GRE Words Once More!(搜索剪枝)
- HDU 5118 GRE Words Once More!(2014亚洲区北京站现场赛)
- 【Hdu 4117】GRE Words
- hdu 5305 (搜索+剪枝)
- HDU 4787 GRE Words Revenge
- HDU 4787GRE Words Revenge
- hdu 4117 GRE Words (AC自动机+线段树)
- hdu 4117 GRE Words (ac自动机 线段树 dp)
- Hdu 4117 GRE Words (后缀数组+dp)
- HDU 4787 GRE Words Revenge(在线AC自动机)
- hdu 4787 GRE Words Revenge(在线AC自动机)
- HDU 1010(搜索题,DFS+剪枝)
- HDU 2437 Jerboas (剪枝搜索)
- hdu 5305 Friends(搜索+剪枝)
- hdu 4090(搜索+可行性剪枝)
- hdu 1010 搜索(dfs+剪枝)
- HDU-5952-Counting Cliques(搜索剪枝)
- HDU 1045 Fire Net(搜索剪枝)
- CUDA编程之示例(GPU读取图像矩阵的像素值--未完待续
- cmd组合和管道命令
- 【web】lodop打印
- 矩形转置问题 从第一行开始输出的
- XYOJ 判断素数
- HDU 5118 GRE Words Once More!(搜索剪枝)
- R中如何利用余弦算法实现相似文章的推荐
- NOI2017退役记
- form表单中标签的使用
- HDU-1425-sort
- Mybatis映射文件处理特殊字符【转发】
- 跟踪用户行为
- XYOJ 多数求最大值
- 服务消费(Ribbon)