• HDU 4912 Paths on the tree


    http://acm.hdu.edu.cn/showproblem.php?pid=4912

    题意:给一棵树,再给一些路径,求最多有多少条路径不相交。

    题解:主要是贪心的想法。用LCA处理出路径的层数,然后从最深处的节点往上找。因为节点越深,对其他路径影响度越小,相交的可能性越低。需要手动扩栈。

      1 #pragma comment(linker, "/STACK:1024000000,1024000000")
      2 #include <iostream>
      3 #include <cstring>
      4 #include <cstdio>
      5 #include <cstdlib>
      6 #include <cmath>
      7 #include <string>
      8 #include <vector>
      9 #include <list>
     10 #include <map>
     11 #include <queue>
     12 #include <stack>
     13 #include <bitset>
     14 #include <algorithm>
     15 #include <numeric>
     16 #include <functional>
     17 #include <set>
     18 #include <fstream>
     19 
     20 using namespace std;
     21 
     22 const int INF=0xfffffff;
     23 const int maxn=100010;
     24 
     25 struct edge
     26 {
     27     int v,next;
     28 }G[maxn*2];
     29 struct node
     30 {
     31     int u,v,id;
     32 }es[maxn];
     33 int head[maxn],idx;
     34 int LCA[maxn],par[maxn],d[maxn];
     35 bool used[maxn];
     36 int parent[maxn];
     37 int depth[maxn];
     38 vector<pair<int,int> >query[maxn];
     39 
     40 int find(int x)
     41 {
     42     return x==par[x]?x:par[x]=find(par[x]);
     43 }
     44 
     45 void build(int u,int v)
     46 {
     47     G[idx].v=v;
     48     G[idx].next=head[u];
     49     head[u]=idx++;
     50 }
     51 
     52 void add_edge(int u,int v)
     53 {
     54     build(u,v);
     55     build(v,u);
     56 }
     57 
     58 void dfs(int u,int root)
     59 {
     60     par[u]=u;
     61     pair<int,int>PI;
     62     for(int i=0;i<(int)query[u].size();i++)
     63     {
     64         PI=query[u][i];
     65         if(d[PI.first]==-1) continue;
     66         LCA[PI.second]=find(PI.first);
     67     }
     68     for(int k=head[u];k!=-1;k=G[k].next)
     69     {
     70         int v=G[k].v;
     71         if(v==root) continue;
     72         d[v]=d[u]+1;
     73         dfs(v,u);
     74         par[v]=u;
     75     }
     76 }
     77 
     78 bool cmp(node& a,node& b)
     79 {
     80     int u=LCA[a.id];
     81     int v=LCA[b.id];
     82     return d[u]>d[v];
     83 }
     84 
     85 void init(int n)
     86 {
     87     memset(used,0,sizeof(used));
     88     memset(head,-1,sizeof(head));
     89     idx=0;
     90     memset(d,-1,sizeof(d));
     91     for(int i=0;i<=n;i++) query[i].clear();
     92 }
     93 
     94 void dfs_res(int u)
     95 {
     96     used[u]=true;
     97     for(int k=head[u];k!=-1;k=G[k].next)
     98     {
     99         int v=G[k].v;
    100         if(used[v]||d[v]<d[u]) continue;
    101         dfs_res(v);
    102     }
    103 }
    104 
    105 int main()
    106 {
    107     //freopen("/Users/apple/Desktop/暑假/30/30/in","r",stdin);
    108     int N,M;
    109     while(scanf("%d%d",&N,&M)!=EOF)
    110     {
    111         init(N);
    112         for(int i=1;i<N;i++)
    113         {
    114             int u,v;
    115             scanf("%d%d",&u,&v);
    116             add_edge(u,v);
    117         }
    118         for(int i=0;i<M;i++)
    119         {
    120             int u,v;
    121             scanf("%d%d",&u,&v);
    122             query[u].push_back(make_pair(v,i));
    123             query[v].push_back(make_pair(u,i));
    124             es[i].u=u;
    125             es[i].v=v;
    126             es[i].id=i;
    127         }
    128         d[1]=0;
    129         dfs(1,-1);
    130         sort(es,es+M,cmp);
    131         int res=0;
    132         for(int i=0;i<M;i++)
    133         {
    134             if(!used[es[i].u]&&!used[es[i].v])
    135             {
    136                 res++;
    137                 dfs_res(LCA[es[i].id]);
    138             }
    139         }
    140         printf("%d
    ",res);
    141     }
    142     return 0;
    143 }
  • 相关阅读:
    如来神掌第一式第十九招----Samba 详解
    如来神掌第一式第十八招----PXE 详解
    如来神掌第二式第七招----典型shell示例
    如来神掌第二式第六招----Shell游戏案例之猜数字
    如来神掌第二式第五招----Shell游戏案例之贪吃蛇
    如来神掌第二式第四招----Shell应用案例之网络监控
    如来神掌第二式第三招----Shell应用案例之主机监控
    如来神掌第二式第二招----Shell应用案例之大文件删除
    如来神掌第二式第一招----Shell脚本基础
    如来神掌第一式第十七招----Mysql 详解
  • 原文地址:https://www.cnblogs.com/der-z/p/3896304.html
Copyright © 2020-2023  润新知