ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P3128 [USACO15DEC]Max Flow P

2021-05-12 02:02:20  阅读:199  来源: 互联网

标签:int Max Flow ne fa depth P3128 include road


原题链接

考察:树上差分

思路:

        点差分模板题.定义d[i] 为某路径上经过i的次数.

 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 using namespace std;
 5 const int N = 50010;
 6 int n,k,h[N],d[N],idx,depth[N],fa[N][16];
 7 struct Road{
 8     int fr,to,ne;
 9 }road[N<<1];
10 void add(int a,int b)
11 {
12     road[idx].fr = a,road[idx].to = b,road[idx].ne = h[a],h[a] = idx++;
13 }
14 void bfs(int s)
15 {
16     queue<int> q;
17     q.push(s);
18     memset(depth,0x3f,sizeof depth);
19     depth[s] = 1,depth[0] = 0;
20     while(q.size())
21     {
22         int u = q.front();
23         q.pop();
24         for(int i=h[u];~i;i=road[i].ne)
25         {
26             int v = road[i].to;
27             if(depth[v]>depth[u]+1)
28             {
29                 depth[v] = depth[u]+1;
30                 q.push(v);
31                 fa[v][0] = u;
32                 for(int j=1;j<=15;j++)
33                  fa[v][j] = fa[fa[v][j-1]][j-1];
34             }
35         }
36     }
37 }
38 int lca(int a,int b) 
39 {
40     if(depth[a]<depth[b]) swap(a,b);
41     for(int j=15;j>=0;j--)
42       if(depth[fa[a][j]]>=depth[b]) a = fa[a][j];
43     if(a==b) return a;
44     for(int j=15;j>=0;j--)
45       if(fa[a][j]!=fa[b][j]) a = fa[a][j],b = fa[b][j];
46     return fa[a][0];
47 }
48 void dfs(int u,int fa)
49 {
50     for(int i=h[u];~i;i=road[i].ne)
51     {
52         int v = road[i].to;
53         if(v==fa) continue;
54         dfs(v,u);
55         d[u]+=d[v];
56     }
57 }
58 int main()
59 {
60     scanf("%d%d",&n,&k);
61     for(int i=1;i<=n;i++) h[i] = -1;
62     for(int i=1;i<n;i++)
63     {
64         int a,b;
65         scanf("%d%d",&a,&b);
66         add(a,b); add(b,a);
67     }
68     bfs(1);
69     while(k--)
70     {
71         int a,b; scanf("%d%d",&a,&b);
72         int anc = lca(a,b);
73         d[a]++,d[b]++,d[anc]--,d[fa[anc][0]]--;
74     }
75     dfs(1,-1);
76     int ans = 0;
77     for(int i=1;i<=n;i++) ans = max(ans,d[i]);
78     printf("%d\n",ans);
79     return 0;
80 }

 

标签:int,Max,Flow,ne,fa,depth,P3128,include,road
来源: https://www.cnblogs.com/newblg/p/14758167.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有