题目链接:HDU-5118

题意:给定一个有向无环图,每条边有一个权值。标定一些特定节点为“特殊节点”。从节点1出发到某“特殊节点”结束的路径,称为一个“GRE单词”。单词由路径上的权值组成。给定一组查询\(k_i\),问由给定的图产生的所有单词,按字典序排序后第\(k_i\)个单词的长度(即由多少条边组成)。

思路:首先这道题最吓人之处在于\(k_i<=10^{8}\),单纯的扫一遍所有可能出现的单词会超时。这时我们发现,输出时只要求输出单词长度,而不要求输出单词内容。由于是DAG,每个节点不会连回到祖宗节点。我们定义vis[i]为从节点i出发可以找到以“特殊节点”结尾的路径的数量。则可以得到递推关系:\(vis[u]=\sum_{V}{vis[v]}\)。同样的道理,我们记录第一次访问每个节点时,产生的所有以“特殊节点”结尾的路径。那么每个节点的子节点其实只需要遍历一次。之后访问时,直接加上之前的结果就可以了。

如果题解说的不是很明白,建议直接看代码,很容易看懂。

网上的一些题解说需要手动dfs,不过本人并没有手动也没有爆栈。建议谨慎地尝试。

 #include"bits/stdc++.h"
using namespace std;
typedef long long LL; // ans[i]为字典序第i的单词
// vis[i]为从节点i出发能找到以“特殊节点”结尾的路径的数量
// firstVis[i]为从节点i出发找到的"所有以“特殊节点”结尾的路径的深度"在ans中存储的起始位置
// firstVisDep[i]为第一次访问i时的深度
const int MAXN=;
const int MAXM=;
struct Edge
{
int u,v,w;
Edge(int uu,int vv,int ww)
{
u=uu,v=vv,w=ww;
}
bool operator < (Edge x)
{
return w < x.w;
}
};
vector<Edge> G[MAXN];
int s[MAXN];
int n,m,q;
int sum;
int ans[MAXM],vis[MAXN],firstVis[MAXN],firstVisDep[MAXN];
void addEdge(int u,int v,int w)
{
G[u].push_back(Edge(u,v,w));
}
void dfs(int u,int dep)
{
if(sum>=) return;
if(vis[u]!=-)
{
for(int i=;i<=vis[u];i++)
{
if(sum>=) return;
ans[++sum]=ans[firstVis[u]+i]+dep-firstVisDep[u];
}
return ;
}
firstVis[u]=sum;
firstVisDep[u]=dep;
if(s[u]) ans[++sum]=dep;
for(unsigned int i=;i<G[u].size();i++)
{
int v=G[u][i].v;
dfs(v,dep+);
}
vis[u]=sum-firstVis[u];
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
int t;
scanf("%d",&t);
for(int tt=;tt<=t;tt++)
{
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++) G[i].clear();
s[]=;
for(int i=;i<=n;i++) scanf("%d",&s[i]);
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
}
for(int i=;i<=n;i++) sort(G[i].begin(),G[i].end());
memset(vis,-,sizeof(vis));
sum=;
dfs(,);
printf("Case #%d:\n",tt);
for(int i=;i<=q;i++)
{
int x;
scanf("%d",&x);
if(x<=sum) printf("%d\n",ans[x]);
else printf("-1\n");
}
}
return ;
}

HDU 5118 GRE Words Once More!的更多相关文章

  1. 综合(奇技淫巧):HDU 5118 GRE Words Once More!

    GRE Words Once More! Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/O ...

  2. [HDU 4787] GRE Words Revenge (AC自动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4787 题目大意: 给你若干个单词,查询一篇文章里出现的单词数.. 就是被我水过去的...暴力重建AC自 ...

  3. hdu 4117 -- GRE Words (AC自动机+线段树)

    题目链接 problem Recently George is preparing for the Graduate Record Examinations (GRE for short). Obvi ...

  4. ●HDU 4787 GRE Words Revenge

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=4787 题解: AC自动机(强制在线构造) 题目大意: 有两种操作, 一种为:+S,表示增加模式串S, 另 ...

  5. hdu 4117 GRE Words AC自动机DP

    题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...

  6. hdu 4117 GRE Words (ac自动机 线段树 dp)

    参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后 ...

  7. HDU 4787 GRE Words Revenge

    Description Now Coach Pang is preparing for the Graduate Record Examinations as George did in 2011. ...

  8. HDU 4117 GRE Words

    这道题不难想到这样的dp. dp[字符串si] = 以si为结尾的最大总权值. dp[si] = max(dp[sj]) ,1.j < i,2.sj是si的子串. 对于第二个条件,是一个多模版串 ...

  9. 2014ACM/ICPC亚洲区北京站题解

    本题解不包括个人觉得太水的题(J题本人偷懒没做). 个人觉得这场其实HDU-5116要比HDU-5118难,不过赛场情况似乎不是这样.怀疑是因为老司机带错了路. 这套题,个人感觉动态规划和数论是两个主 ...

随机推荐

  1. CF995A Tesla

    题目描述 Allen dreams of one day owning a enormous fleet of electric cars, the car of the future! He kno ...

  2. (转)java +libsvm 安装与测试:

    libsvm 用SVM实现简单线性分类  (转自:http://www.cnblogs.com/freedomshe/archive/2012/10/09/2717356.html) 0. 下载lib ...

  3. HDOJ.2037 今年暑假不AC (贪心)

    今年暑假不AC 点我挑战此题 题意分析 给出来n组节目的起止时间,让求出所最多能观看的完整节目个数. 贪心策略:按照节目的结束时间升序排序,比较下一项的开始时间是否比上一项的结束时间大,是的话计数器+ ...

  4. 数据治理(Data Governance)

    今天看到一篇数据治理的论文,以下为论文内容的记录与学习. 数据治理是指将数据作为企业资产而展开的一系列的具体化工作,是对数据的全生命周期管理.数据治理的目标是提高数据质量(准确性和完整性),保证数据的 ...

  5. sudoers文件配置

    http://note.drx.tw/2008/01/linuxsudo.html foobar ALL=(ALL) ALL 現在讓我們來看一下那三個 ALL 到底是什麼意思.第一個 ALL 是指網路 ...

  6. 【IntelliJ IDEA 12使用】导入外部包

    以前用eclipse,现在用IntelliJ IDEA,发现它确实是个很不错的工具. 用IntelliJ IDEA12这个版本导入外部JAR包,这样来操作,打开Project Structure,在m ...

  7. SDUT 3930 线段树

    皮卡丘的梦想2 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一天,一只住在 501 实验 ...

  8. 解决华为手机用rem单位,内容超出屏幕宽度问题

    在H5手机页面上,用rem单位布局,配合js计算出一个根节点的font-size(原理是屏幕宽度乘以一个固定比例,如1/100),之后页面中所有的px全都换算成了rem单位来写,优点是能适配各种不同屏 ...

  9. vue实现菜单权限控制

    大家在做后台管理系统时一般都会涉及到菜单的权限控制问题.当然解决问题的方法无非两种——前端控制和后端控制.我们公司这边的产品迭代速度较快,所以我们是从前端控制路由迭代到后端控制路由.下面我会分别介绍这 ...

  10. j2ee 项目部署指引

    j2ee相关的项目一般是web工程或java application,部署到linux服务器上,本文结合自己的经验.教训,总结下部署的过程. 一.准备阶段 部署前要做的事情: 1.明确自己的产品都包含 ...