Hdu 5452 Minimum Cut (2015 ACM/ICPC Asia Regional Shenyang Online) dfs + LCA

题目链接:

  Hdu 5452 Minimum Cut

题目描述:

  有一棵生成树,有n个点,给出m-n+1条边,截断一条生成树上的边后,再截断至少多少条边才能使图不连通, 问截断总边数?

解题思路:

  因为只能在生成树上截断一条边(u, v),所以只需要统计以v为根节点的子生成树里的节点与子生成树外的节点的边数就可以了。对于新加入的边(u‘, v‘)来说,只影响以LCA(u, v)为根节点的子树里面的节点。统计所有答案,扫一遍输出最小即可。(比赛的时候只统计叶子节点,给水过去了........23333333)

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int INF = 0x3f3f3f3f;
 8 const int maxn = 20010;
 9 struct node
10 {
11     int to, next;
12 }edge[maxn*2];
13 int tot, head[maxn], deep[maxn], fa[maxn], ans[maxn];
14
15 void init ()
16 {
17     tot = 0;
18     memset (head, -1, sizeof(head));
19 }
20
21 void Add (int from, int to)
22 {
23     edge[tot].to = to;
24     edge[tot].next = head[from];
25     head[from] = tot ++;
26 }
27
28 void dfs (int u, int father, int dep)
29 {
30     deep[u] = dep;
31     ans[u] = 1;
32     fa[u] = father;
33
34     for (int i=head[u]; i!=-1; i=edge[i].next)
35     {
36         int v = edge[i].to;
37         if (v != father)
38             dfs (v, u, dep+1);
39     }
40 }
41
42 void LCA (int x, int y)
43 {
44     while (x != y)
45     {
46        if (deep[x] >= deep[y])
47        {
48            ans[x] ++;
49            x = fa[x];
50        }
51        else
52        {
53            ans[y] ++;
54            y = fa[y];
55        }
56     }
57 }
58
59 int main ()
60 {
61     int t, n, m, i;
62     scanf ("%d", &t);
63
64     for (int j=1; j<=t; j++)
65     {
66         init ();
67         int u, v;
68         scanf ("%d %d", &n, &m);
69
70         for (i=1; i<n; i++)
71         {
72             scanf ("%d %d", &u, &v);
73             Add (u, v);
74             Add (v, u);
75         }
76         dfs (1, 0, 1);
77
78         for ( ;i<=m; i++)
79         {
80             scanf ("%d %d", &u, &v);
81             LCA (u, v);
82         }
83
84         int res = INF;
85         for (i=2; i<=n; i++)
86             res = min (res, ans[i]);
87         printf ("Case #%d: %d\n", j, res);
88     }
89     return 0;
90 }
时间: 2024-11-09 04:26:37

Hdu 5452 Minimum Cut (2015 ACM/ICPC Asia Regional Shenyang Online) dfs + LCA的相关文章

Hdu 5451 Best Solver (2015 ACM/ICPC Asia Regional Shenyang Online) 暴力找循环节 + 递推

题目链接: Hdu  5451  Best Solver 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 解题思路: x的取值为[1, 232],看到这个指数,我的心情是异常崩溃的.(吐血......) 可是仔细观察,它指数大,可是mod小啊,它吓人,可是可以暴力搞啊!! 这个题目一个难点就是要向下取整求余,详解见传送门,本题是向下取整,也就是向上取整加一. 还有就是指数太大,要找到循环节,其实由于mod小,循环节并没有太大,暴力跑就ok啦!  此刻内心是崩溃的 1 #i

【题解】 2015 ACM/ICPC Asia Regional Shenyang Online

[1006] FangFang (暴力枚举) Fang Fang Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 871    Accepted Submission(s): 364 Problem Description Fang Fang says she wants to be remembered. I promise her.

2015 ACM/ICPC Asia Regional Shenyang Online

1001 Traversal 1002 Best Solver 1003 Minimum Cut 1004 Dividing This Product 1005 Excited Database 1006 Fang Fang 1007 Matches Puzzle Game 1008 Hold Your Hand 1009 Stability 1010 Jesus Is Here 1011 Poker 1012 Largest Point 1013 Manors

(字符串处理)Fang Fang -- hdu -- 5455 (2015 ACM/ICPC Asia Regional Shenyang Online)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=5455 Fang Fang Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 233    Accepted Submission(s): 110 Problem Description Fang Fang says she wants to be

【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5489 题目大意: 一个N(N<=100000)个数的序列,要从中去掉相邻的L个数(去掉整个区间),使得剩余的数最长上升子序列(LIS)最长. 题目思路: [二分][最长上升子序列] 首先,假设去掉[i,i+m-1]这L个数,剩余的LIS长度为max(i左端最后一个不大于a[i+m]的LIS长度+a[i+m]开始到最后的LIS长度). 所以,我们从n到1逆向先求最长下降子序列的长度f[i],就可以知

【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意: 一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在[s1,s2]范围内.D已经满足[s1,s2]. 题目思路: [贪心][模拟] 首先将这个数转成二进制统计总共1的个数s,再求出末尾连续0和1的个数n0,n1. 如果最后一位是0: s=s2,那么为了保证s<s2且答案>D,先设ans=d+lowbit(d),此时满足了新的s<s2且答案&g

Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果顺时针和逆时针的起始下标相同,则输出顺时针. 解题思路: 看到题目感觉后缀数组可以搞,正准备犯傻被队友拦下了,听队友解释一番,果断丢锅给队友.赛后试了一下后缀数组果然麻烦的不要不要的(QWQ),还是最大最小表示法 + KMP来的干净利索. 最大表示法:对于一个长度为len文本串,经过循环旋转得到长度

Hdu 5459 Jesus Is Here (2015 ACM/ICPC Asia Regional Shenyang Online) 递推

题目链接: Hdu 5459 Jesus Is Here 题目描述: s1 = 'c', s2 = 'ff', s3 = s1 + s2; 问sn里面所有的字符c的距离是多少? 解题思路: 直觉告诉我们,sn肯定由sn-1与sn-2推导出来的.然后呢,我们可以看出 n%2==1 的时候 sn-1 与 sn-2 由 ffff 衔接起来的,n%2==0 的时候,sn-1 与 sn-2由 ff 衔接起来的.告诉队友后,队友就把这个当成重要依据推啊,推啊!!到最后感觉丢队友自己看药丸,放弃02回来和队友

HDU - 5491 The Next 2015 ACM/ICPC Asia Regional Hefei Online

从D+1开始,对于一个数x从它出发到x+lowbit(x)之前1的数量都是单调不减的,因此1的数量在一个范围内是一个区间. 每次判断一下有没有和[s1,s2]有没有交集. #include<bits/stdc++.h> using namespace std; inline int read() { char c; while(c=getchar(),c<'0'||c>'9'); int re = c-'0'; while(c=getchar(),c>='0'&&am