摘要: 思路:先将图进行缩点,建成一颗树,那么如果这是一条单路径树(即最大点度不超过2),就不在能删的一条边,使得不连通。因为将其头尾相连,形成一个圈,那么删任意一条边,图都是连通的。上面的是无解的情况,如果有解,那么这个解一定是树中不全在一条路径上的三条边中的一条,使得这三条边中的最大边最小,即得解。同样,对任意一个节点,其三个子树上的边一定是三条不全在一条路径上的边。问题就转化为求一个节点的第三小边。但直接求第三小边容易出错,并且不易求得。我们可以先选一条树中的最小边,这条边一定是三条边中的一条,我们就沿着这条边的两个端点找。那么问题就又变成了求一个节点的次小边了。这个很容易求得。感谢http:/ 阅读全文
posted @ 2013-08-07 21:41 fangguo 阅读(534) 评论(3) 推荐(0) 编辑
摘要: 思路:我们定义一个dfn[i],Maxndfn[i]来确定节点i的访问次序,以及其子节点的最大访问次序。那么另一个节点是其子树的节点当且仅当dfn[j]>=dfn[i]&&dfn[j]#include#include#include#include#define Maxn 100010#define inf 0x7fffffffusing namespace std;int son[Maxn],nson[Maxn],der[Maxn],nder[Maxn],n,q,dfn[Maxn],Maxdfn[Maxn],lab,dp[Maxn],road[Maxn],father[ 阅读全文
posted @ 2013-08-07 17:13 fangguo 阅读(360) 评论(0) 推荐(0) 编辑
摘要: 思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫。#include#include#include#include#define Maxn 1010using namespace std;int sum[Maxn],worm[Maxn],le[Maxn],vi[Maxn],head[Maxn],e,n,back[Maxn];struct Edge{ int u,v,next;}edge[Maxn*Maxn];void init(){ memset(sum,0,sizeof(sum)); ... 阅读全文
posted @ 2013-08-07 14:01 fangguo 阅读(149) 评论(0) 推荐(0) 编辑