hdu 5469 Antonidas (dfs+剪枝)2015 ACM/ICPC Asia Regional Shanghai Online
题意:
给出一棵树,再给出每个节点上的值(一个char字符)这些值以一个字符串s1表示,然后给出一个s2字符串,问在这棵树上是否存在两个点,从一个点走到另一个点所经过的路径上的char字符组成的字符串正好等于s1。问是否存在这么两个点。如果存在,则输出“Find”,否则,输出“Important”。
题解:
使用dfs就可以解决,但是需要进行剪枝,否则就会tle。
剪枝的方法是这样的——假设节点1是根节点,然后我们先使用一次dfs记录每个节点到叶节点的最长的路径dis[x]。
然后开始搜索,每次搜到当前点x的dis[x],如果dis[x]>剩下的字符串s1的值,那么可以走这条路,否则就不走这条路,看这个点的父节点是否满足。
上面那句话可能有些难以理解,具体来讲就是这个意思——如果从当前节点ch向它的叶节点走,需要满足的条件是从点ch到离她最远的叶节点的长度要大于剩余的未匹配的s2串的长度。如果向ch的父节点走,那么就不需要判断了(其实也可以判断,只是要么很麻烦,要么没必要,如果有即简洁又有效的方法,洗耳恭听)。
具体见代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const int N = ; struct Edge
{
int to, next;
}edge[N<<]; //前向星标,记录邻接表 int head[N], fm[N]; //节点i的edge[]下标 / 节点i的父节点
int dis[N]; //节点i到最远叶节点的长度
bool vis[N];
int n, t, k;
int len;
char s1[N], s2[N]; //源串与匹配串 void add(int u, int v)
{
edge[k].to = v;
edge[k].next = head[u];
head[u] = k++;
} void tdfs(int x)
{
int mdis = -;
for(int i = head[x]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if(!vis[v])
{
vis[v] = ;
tdfs(v);
fm[v] = x;
mdis = mdis > dis[v] ? mdis : dis[v];
}
}
dis[x] = mdis == - ? : mdis+; //记录每个节点到最远的叶节点的长度
} bool dfs(int x, int disx, int mlen) //核心dfs
{
if(disx- > len) return ; //如果已匹配的长度已超过匹配串长度,即,存在这么一个串,及时返回1
if(dis[x] > mlen) //如果向叶节点走路径长度大于剩下未匹配的串的长度,则向这个方向走
{
for(int i = head[x]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if(!vis[v] && s1[v] == s2[disx])
{
vis[v] = ;
if(dfs(v, disx+, mlen-)) return ;
}
}
}
if(!vis[fm[x]] && s1[fm[x]] == s2[disx]) //向父节点搜索
{
vis[fm[x]] = ;
return dfs(fm[x], disx+, mlen-);
}
return ; //都不存在,则返回0
} void init()
{
scanf("%d", &n);
k = ;
memset(head, -, sizeof(head));
for(int i = ; i < n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
memset(dis, , sizeof(dis));
memset(vis, , sizeof(vis));
tdfs();
scanf("%s%s", s1+, s2+);
len = strlen(s2+)-;
} int main()
{
//freopen("test.in", "r", stdin);
scanf("%d", &t);
for(int tm = ; tm <= t; tm++)
{
init();
bool flag = ;
for(int i = ; i <= n; i++)
{
if(s1[i] == s2[])
{
memset(vis, , sizeof(vis));
if(dfs(i, , len))
{
flag = ;
break;
}
}
}
printf("Case #%d: ", tm);
if(flag) printf("Find\n");
else printf("Impossible\n");
}
return ;
}
hdu 5469 Antonidas (dfs+剪枝)2015 ACM/ICPC Asia Regional Shanghai Online的更多相关文章
- 【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意: 一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走.求(N+ ...
- Hdu 5459 Jesus Is Here (2015 ACM/ICPC Asia Regional Shenyang Online) 递推
题目链接: Hdu 5459 Jesus Is Here 题目描述: s1 = 'c', s2 = 'ff', s3 = s1 + s2; 问sn里面所有的字符c的距离是多少? 解题思路: 直觉告诉我 ...
- HDU 5444 Elven Postman (2015 ACM/ICPC Asia Regional Changchun Online)
Elven Postman Elves are very peculiar creatures. As we all know, they can live for a very long time ...
- 2015 ACM/ICPC Asia Regional Shanghai Online
1001 Puzzled Elena 1002 Antonidas 1003 Typewriter 1004 Count the Grid 1005 Code Formatting 1006 Ther ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)
http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others) ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...
- HDU 4291 A Short problem(2012 ACM/ICPC Asia Regional Chengdu Online)
HDU 4291 A Short problem(2012 ACM/ICPC Asia Regional Chengdu Online) 题目链接http://acm.hdu.edu.cn/showp ...
随机推荐
- 私有虚函数的特点(C++和Java的机制还有所不同)
多态性与将实现多态的函数的访问限定符没有任何关系,private 函数仍然可以实现多态,它的指针仍然位于vtbl中,只不过该函数的多态一般只能在基类的内部由其他非虚函数调用该函数的时候反映出来,访问限 ...
- servlet实现文件下载
之前没怎么用过这个,这次项目中用到了,于是总结一下: 应该说主要注意三方面: 1.写一个servlet 2.在web.xml中配置这个servlet 3.页面上调用这个servlet 第一: 写 ...
- SSIS ->> Logging
SSIS提供了Event Handler之外的另一种方法捕捉Event和获取需要的信息,这种方法是Logging.SSIS的Logging针对不同的组件可以提供比Event Handler更多的Eve ...
- 巧用cssText属性批量操作样式
给一个HTML元素设置css属性,如 1 2 3 4 var head= document.getElementById("head"); head.style.width = & ...
- Backbone seajs
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 同一Session中的aspx页面的并发限制
项目中客户端采用WebBrowser展示aspx页面,用户有可能打开带多个带WebBrowser的winform窗体.此时,如果其中一个的WebBrowser的aspx页面响应较长的话,其他窗体中的W ...
- UI抑制限制(UI Suppression Limitations)
运行UI抑制的Lync进程使你的应用程序可以访问同一个Lync客户端终端,SIP处理和所有非抑制Lync客户端使用的媒体处理,但具有以下限制.SDK中的可见组件不可用,除了视频窗体(video win ...
- ubuntu下启动和关闭tomcat的简单方法
在ubuntu下面,我们安装tomcat可以有两种方式[1]用aptitude安装aptitude install tomcat6 [2]免安装版从apache tomcat 网站下载apache-t ...
- django 外键 ,django __
data sqlite> select * from author; id name age 1 jim 12 2 tom 11 sqlite> select * from book; i ...
- 【HDOJ】1362 The Bermuda Triangle
1. 题目描述给定几个三角形拼成一个百慕大三角形. 2. 基本思路基本思路肯定是搜索,关键点是剪枝.(1) 若存在长度为$l$的边,则一定可以拼成长度为$k \cdot l$的三角形,则可拼成长度为$ ...