题意:

  先给出一棵树,然后再给出m条边,把这m条边连上,然后剪掉两条边,一条是原边,一条是新边,问有多少种方案能使图不连通。

思路:

  从原边的角度看
    1.树加边,一定成环,加一条(u,v)边就有u->lca->v上的边被覆盖一次
    2.当一条边没被覆盖时,删去该边与任意一条新边都能使图不连通,即有m种方案
    3.当一条边被覆盖1次时,删去与该边成环的新边,即有1种方案
    4.当一条边被覆盖1次以上时,没有方案
  用树形dp,dp[i]表示第i号点与其父亲相连的边被覆盖的次数。一条新边(u,v)加入则++dp[u],++dp[v],dp[lca(u,v)]-=2,计算时从叶子结点向上累加,子节点的值加到父节点上,最后每个节点上的值就是覆盖次数。

反思:

  1.倍增求lca时不熟练。
  2.计算时根节点不计算。

代码:

 #include<cstdio>
const int M=;
#define swap(x,y) t=x,x=y,y=t
int t,cnt,ans,v[M<<],dp[M],dep[M],hea[M<<],nex[M<<],p[M][]; int read()
{
int x=; char ch=getchar();
while (ch< || ch>) ch=getchar();
while (ch> && ch<) x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
} void add(int x,int y) { v[++cnt]=y,nex[cnt]=hea[x],hea[x]=cnt; } void dfs(int u,int x)
{
dep[u]=dep[p[u][]=x]+;
for (int i=hea[u];i;i=nex[i])
if (v[i]^x) dfs(v[i],u);
} int lca(int x,int y)
{
if (dep[x]<dep[y]) swap(x,y);
for (int i=;~i;--i)
if (dep[p[x][i]]>=dep[y]) x=p[x][i];
if (x==y) return x;
for (int i=;~i;--i)
if (p[x][i]^p[y][i]) x=p[x][i],y=p[y][i];
return p[x][];
} void DFS(int u,int x)
{
for (int i=hea[u],y;y=v[i],i;i=nex[i])
if (y^x) DFS(y,u),dp[u]+=dp[y];
} int main()
{
int n=read(),m=read(),x,y,i,j;
for (i=;i<n;++i) x=read(),y=read(),add(x,y),add(y,x);
dfs(,);
for (i=;i<;++i)
for (j=;j<=n;++j)
if (p[j][i-]) p[j][i]=p[p[j][i-]][i-];
for (i=;i<=m;++i) ++dp[x=read()],++dp[y=read()],dp[lca(x,y)]-=;
DFS(,);
for (i=;i<=n;++i)
if (!dp[i]) ans=ans+m;
else if (dp[i]==) ++ans;
printf("%d\n",ans);
return ;
}

poj 3417 Network 题解的更多相关文章

  1. poj 3417 Network(tarjan lca)

    poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...

  2. 【题解】POJ 3417 Network(倍增求LCA+DP+树上差分)

    POJ3417:http://poj.org/problem?id=3417 思路 我们注意到由“主要边”构成一颗树 “附加边”则是非树边 把一条附加边(x,y)加入树中 会与树上x,y之间构成一个环 ...

  3. POJ 3417 Network

    每条额外的边加入到图中,会导致树上一条路径成环,假设没有其余边,那么要将新图分成两部分,如果想删一条成环路径上的边,那么必须把这条额外边也删除. 因此每条额外边加入时,只需将环上的边+1.最后看看每条 ...

  4. poj 3417 Network (LCA,路径上有值)

    题意: N个点,构成一棵树.给出这棵树的结构. M条边,(a1,b1)...(am,bm),代表给树的这些点对连上边.这样就形成了有很多环的一个新"树". 现在要求你在原树中断一条 ...

  5. POJ 1236 Network of Schools(强连通 Tarjan+缩点)

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  6. ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法

    题目连接:problemId=542" target="_blank">ZOJ 1542 POJ 1861 Network 网络 Network Time Limi ...

  7. POJ 1236 Network of Schools(强连通分量)

    POJ 1236 Network of Schools 题目链接 题意:题意本质上就是,给定一个有向图,问两个问题 1.从哪几个顶点出发,能走全全部点 2.最少连几条边,使得图强连通 思路: #inc ...

  8. Poj 3694 Network (连通图缩点+LCA+并查集)

    题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...

  9. Poj 1236 Network of Schools (Tarjan)

    题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个 ...

随机推荐

  1. 十个非常棒的学习angularjs的英文网站

    AngularJS 是非常棒的JS框架,能够创建功能强大,动态功能的Web app.AngularJS自2009发布以来,已经广泛应用于Web 开发中.但是对想要学习Angular JS 的人而言,只 ...

  2. 《Redis开发与运维》快速笔记(一)

    1.前言&基本介绍 在原始的系统架构中,我们都由程序直接连接DB,随着业务的进一步开展,DB的压力越来越大,为了缓解DB的这一压力,我们引入了缓存,在程序连接DB中加入缓存层, 从而减轻数据库 ...

  3. Phalcon初认识

    Phalcon以c扩展交付的全堆栈php开发框架 基本功能 低开销:低内存消耗和CPU相比传统的框架 MVC和HMVC:模块.组件.模型.视图和控制器 依赖注入:依赖注入和位置的服务和它的本身他们的容 ...

  4. Java三大特性之继承

    二.类的继承 1. 概念:从已有的类中派生出新的类,新的类能吸收已有类的属性和行为,并能扩展新的能力. 2. 一个不由任何类派生出来的类称为基类,一个派生类最近的上层类称为该类的父类,从某一类派生出来 ...

  5. mysql踩坑记录之limit和sum函数混合使用问题

    问题复盘本次复盘会用一个很简单的订单表作为示例. 数据准备订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( `i ...

  6. LinkdList和ArrayList异同、实现自定义栈

    //.LinkdList和ArrayList异同 //ArrayList以连续的空间进行存储数据 //LinkedList以链表的结构存储数据 //栈 先进后出 最上面是栈顶元素 arrayLiat自 ...

  7. HTML5新特性之History

    几年前,Ajax的兴起给互联网带来了新的生机,同时也使用户体验有了质的飞跃,用户无需刷新页面即可获取新的数据,而页面也以一种更具有交互性的形式为用户展现视图,可以说这种变化对互联网发展的贡献是史无前例 ...

  8. 剑指offer8 旋转数组的最小数字

    一种错误写法: class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { int len ...

  9. CF-478C

    You have r red, g green and b blue balloons. To decorate a single table for the banquet you need exa ...

  10. sql数据表的设计思路

    好的表结构分的比较细致,个人理解大概主要分为主表.明细.历史记录表.中间表,辅助表结构应该分为:类型表.状态表.统计表.统计明细表等.为了一个功能加那么多表实在是多余,如果写一个非常复杂的业务逻辑还是 ...