poj3417(LCA+DP)

news/2024/7/8 6:41:46

题目连接:http://poj.org/problem?id=3417

tarjan+树DP

来自:http://www.cnblogs.com/scau20110726/archive/2013/05/31/3110666.html

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  5 using namespace std;
  6 const int N=100005;
  7 const int Q=100005;
  8 
  9 int te,tq;
 10 int heade[N],headq[N],dp[N],f[N],vis[N];
 11 struct edge
 12 {
 13     int u,v,nex;
 14 }e[N*2];
 15 
 16 struct query
 17 {
 18     int u,v,lca,nex;
 19 }q[Q*2];
 20 
 21 void adde(int u,int v)
 22 {
 23     e[te].v=v;
 24     e[te].u=u;
 25     e[te].nex=heade[u];
 26     heade[u]=te++;
 27 }
 28 void addq(int u,int v)
 29 {
 30     q[tq].u=u;
 31     q[tq].v=v;
 32     q[tq].lca=-1;
 33     q[tq].nex=headq[u];
 34     headq[u]=tq++;
 35 }
 36 int gf(int x)
 37 {
 38     return x==f[x]?x:f[x]=gf(f[x]);
 39 }
 40 
 41 void tarjan(int u)
 42 {
 43     vis[u]=1;
 44     for(int i=headq[u];i!=-1;i=q[i].nex)
 45         if(vis[q[i].v])
 46         {
 47             int v=q[i].v;
 48             int lca=gf(v);
 49             q[i].lca=q[i^1].lca=lca;
 50         }
 51     for(int i=heade[u];i!=-1;i=e[i].nex)
 52         if(!vis[e[i].v])
 53         {
 54             int v=e[i].v;
 55             tarjan(v);
 56             f[v]=u;
 57         }
 58 }
 59 
 60 void DP(int u)
 61 {
 62     vis[u]=1;
 63     for(int i=heade[u];i!=-1;i=e[i].nex)
 64         if(!vis[e[i].v])
 65         {
 66             int v=e[i].v;
 67             DP(v);
 68             dp[u]+=dp[v];
 69         }
 70 }
 71 int main()
 72 {
 73       int n,t;
 74 
 75       while(scanf("%d%d",&n,&t)!=EOF)
 76       {
 77           te=tq=0;
 78           memset(heade,-1,sizeof(heade));
 79           memset(headq,-1,sizeof(headq));
 80           memset(dp,0,sizeof(dp));
 81           memset(vis,0,sizeof(vis));
 82           for(int i=1;i<=n;i++) f[i]=i;
 83           for(int i=1;i<n;i++)
 84           {
 85               int u,v;
 86               scanf("%d%d",&u,&v);
 87               adde(u,v);
 88               adde(v,u);
 89           }
 90           for(int i=0;i<t;i++)
 91           {
 92               int u,v;
 93               scanf("%d%d",&u,&v);
 94               addq(u,v);
 95               addq(v,u);
 96               dp[u]++;
 97               dp[v]++;
 98           }
 99           tarjan(1);
100           for(int i=0;i<t;i++)
101           {
102               int s=i*2;
103               int lca=q[s].lca;
104               dp[lca]-=2;
105           }
106           memset(vis,0,sizeof(vis));
107           DP(1);
108           int res=0;
109           for(int i=2;i<=n;i++)
110               if(dp[i]==1) res++;
111                 else if(dp[i]==0) res+=t;
112           printf("%d\n",res);
113 
114       }
115 }

 

转载于:https://www.cnblogs.com/yijiull/p/6754175.html


http://www.niftyadmin.cn/n/4049293.html

相关文章

升级android studio 4.1没有flutter、Dart插件

升级Android Studio 4.1.3没有flutter、Dart插件&#xff0c;无法创建flutter项目。 搜索发现Android Studio 4.1.3安装之后不再自带flutter和dart ,需要自己手动安装。 点击Android Studio -> Preferences 搜索安装flutter和dart插件 在Marketplace搜索flutter和dart并…

java web实例训练知识错误总结(三)

一、request的getParameter()和getAttribute()的区别 getParameter 是用来接受用post个get方法传递过来的参数的.getAttribute 必须先setAttribute.&#xff08;1&#xff09;request.getParameter() 取得是通过容器的实现来取得通过类似post&#xff0c;get等方式传入的数据&a…

回家过年啦!

上上个星期六的晚上还是很冷&#xff08;1月6号&#xff09;&#xff0c;突然在星期天晚上在被窝里面感觉很热&#xff0c;自己第一次感觉到春天已经来到了&#xff01;我有一种说不出的心情。身处湖州&#xff0c;自己有一种很想回家的感觉&#xff0c;很想看看爸爸妈妈的感觉…

项目组的同志在公司上班(20060124)

这个星期道公司上班&#xff0c;体验了一回在公司上班的滋味。项目组的同志在这里上班真正的与众不同&#xff0c;上班想几点就几点&#xff0c;真是爽阿。星期一&#xff0c;我睡觉到了10点半&#xff0c;然后乘74路车到公司&#xff0c;因为今天大家都回来了&#xff0c;晚上…

[Java] List.of() 报错问题解决

首先&#xff0c;检查您使用的Java版本是否正确&#xff1f; 由于Java 9才支持List接口的static工厂方法&#xff0c;请参见List.of。 private static List<Item> defaultItems() {//java 8return Arrays.asList(new Item(1L, "Burger", 599L, "Tasty&qu…

使用DOM4J维护手机收藏信息

public class DOM4JPares3 { Document doc null; public void getDocument() { SAXReader sax new SAXReader(); try { doc sax.read("收藏信息.xml"); } catch (DocumentException e) { e.printStackTrace(); } } // 显示手机的品牌及型号 public void showInfo(…

[DWR(Ajax)]DWR使用笔记

[DWR(Ajax)]DWR使用笔记 DWR是一个框架&#xff0c;简单的说就是能够在javascript直接调用java方法&#xff0c;而不必去写一大堆的javascript代码。它的实现是基于ajax的&#xff0c;可以实现无刷新效果。 网上有不少DWR的例子&#xff0c;但大都只是某种方法的调用&…