Description
为了得到一个F(1 < = F < = 5000)放牧场(编号1 . . F)到另一个领域,贝西和其他群体被迫交叉树附近的烂苹果。牛现在厌倦了经常被迫参加一个特定的路径和想要建立一些新的路径,这样他们总是有一个选择至少两个独立的路线之间的任何一对字段。他们现在每一对之间至少有一个路线字段和想至少有两个。当然,他们只能在官方的路径,当他们从一个领域转移到另一个。
给定的描述当前组(f - 1 < = R < = 10000)路径,每个连接两个不同的领域,确定新路径的最小数量(每个连接两个放牧场),必须建立。
可能已经有多个路径之间相同的放牧场。对,你也可以建立一个新的路径连接同一领域的其他路径。
Input
第一行:两个空格分隔的整数:F和R
行2 . .R + 1:每一行包含两个空格分隔的整数字段的一些路径的端点。
Output
第一行:个整数,必须建立新的路径的数量。
Sample Input
7 7
1 2
2 3
3 4
2 5
4 5
5 6
5 7
Sample Output
2
HINT
解释样本:
一个可视化的路径是:
1 2 3
+---+---+
| |
| |
6 +---+---+ 4
/ 5
/
/
7 +
建立新的路径从1到6和4 - 7满足条件。
1 2 3
+---+---+
: | |
: | |
6 +---+---+ 4
/ 5 :
/ :
/ :
7 + - - - -
检查一些路线:
1 - 2:1 - > 2 - > 6 - > 5 - > 2
1 - 4:1 - > 2 - > 3 - > 4和1 - > 6 - > 5 - > 4
3 - 7:3 - > 4 - > 7和3 - > 2 - > 5 - > 7
事实上,每一对放牧场连接由两个路线。
有可能添加一些其他路径也将解决这个问题(像一个从6到7)。
(图中叶子的数量+1)/2即为正确答案。
#include <iostream>
#define SIZE 5010
using namespace std;
int degree[SIZE];
int main(int argc, char** argv)
{
int n, m, u, v, i, leaf = 0;
scanf("%d%d", &n, &m);
while (m--)
{
scanf("%d%d", &u, &v);
if (u != v)
{
++degree[u]; // 只要加度数,vector<int>::push_back()免谈
++degree[v];
}
}
for (i = 1; i <= n; ++i)
{
if (degree[i] == 1) // 是叶子
{
++leaf;
}
}
printf("%d", (leaf + 1) / 2); // 这就是正确答案
return 0;
}