#69-【水】多余的路径

博客围绕放牧场路径规划问题展开,牛群想在任意两个放牧场间至少有两条独立路线。给定当前路径描述,需确定要建立的新路径最小数量。输入为放牧场数量和路径端点信息,输出是新路径数量,通过计算图中叶子数量得出答案。

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值