一、题目描述

The N cities of Estiah are connected by N-1 roads. The roads are built in a way that it’s always possible to travel between any two cities.

Now the king of Estiah wants to pair adjacent cities into defending units. Two cities are adjacent if they are connected directly by a road. Each defending unit consists of exactly two cities, and each city can never be paired into two different defending units.

What the king wants to know is if it’s possible to have all the cities paired into defending units. Can you help him ?

二、输入

The input consists of several test cases.

The first line of the input is an positive integer indicating the number of test cases following.

Each test case starts with an positive integer N (1<=N<=10000) , which is the number of cities. Cities are numbered from 1 to N.

The next N-1 lines each contains two positive integer A and B, indicating that there is a road connecting city A and city B.

三、输出

For each test case, output a line containing “Yes” if there is a way to pair all the cities, or “No” otherwise.

例如:

输入:

2

6

3 4

6 5

4 6

2 1

6 2

6

3 4

2 1

4 6

4 2

6 5

输出:

Yes

Yes

四、解题思路

题中愿意是:有N个点,n-1条边使n个点组成连通图。从题中能够看出,这是一个最小生成树。题中要求,没相连的两个城市可以组成一组,而且每个城市只能归于一组。

思路:

从图中找出其中一个度为1的点,删掉该点与和该点相连的另外一个点,已经与他们相连的边。不断重复该步骤,直到不存在度为1的点,如果已经全部配对完,表示能配对,否则不能配对。

步骤:

1、找出图中其中一个度为1的点,如下图点“1”

2、找到与点1相连的那个点,点“2”

3、删掉与点“2”相连的所有的边

4、找出图中其中一个度为1的点,如下图点“3”

5、找到与点3相连的那个点,点“4”

6、删掉与点“4”相连的所有的边

7、找出图中其中一个度为1的点,如下图点“5”

8、找到与点5相连的那个点,点“6”

9、删掉与点“6”相连的所有的边

因为已经配对完所有的点,所以能成功配对

五、代码

#include<iostream>

using namespace std;

int main()
{
int times;
cin >> times;
while(times--)
{
int pointCount; //城市的个数 int delPointNum = 0; //已经能配对好的城市个数 cin >> pointCount;
int edgeArray[pointCount][2]; //保存相连的两个城市
int pointLigature[pointCount]; //连接每个城市的度
for(int i = 0; i < pointCount; i++)
{
pointLigature[i] = 0;
}
for(int i = 0; i < pointCount - 1; i++)
{
int startPoint, endPoint;
cin >> startPoint >> endPoint;
edgeArray[i][0] = startPoint;
edgeArray[i][1] = endPoint;
pointLigature[startPoint - 1]++;
pointLigature[endPoint - 1]++;
} if(pointCount % 2 == 1) {cout << "No" << endl;continue;} //如果城市的个数是奇数个直接判断不能配对 int maxDelTime = pointCount;
while(maxDelTime--) //如果存在着度为1的顶点(城市),每次循环都会配对(删掉)一对
{
int delPoint = 0; //找出度为1的顶点
for(; delPoint< pointCount; delPoint++)
{
if(pointLigature[delPoint] == 1)
{
delPointNum += 2;
break;
}
} for(int i = 0; i < pointCount - 1; i++) //找出与度为1的顶点相连的顶点
{
if(edgeArray[i][0] == delPoint + 1) {delPoint = edgeArray[i][1]; break;}
if(edgeArray[i][1] == delPoint + 1) {delPoint = edgeArray[i][0]; break;}
} for(int i = 0; i < pointCount - 1; i++) //以与度为1的顶点相连的顶点为中心,删掉与它相连的路径
{
if(edgeArray[i][0] == delPoint || edgeArray[i][1] == delPoint)
{
int point;
point = edgeArray[i][0] - 1;
pointLigature[point]--;
point = edgeArray[i][1] - 1;
pointLigature[point]--;
edgeArray[i][0] = 0;
edgeArray[i][1] = 0;
}
} } if(delPointNum >= pointCount) cout << "Yes" << endl;
else cout << "No" << endl;
} return 0;
}

<Sicily>Pair的更多相关文章

  1. c++ pair 使用

    1. 包含头文件: #include <utility> 2. pair 的操作: pair<T1,T2> p; pair<T1,T2> p(v1,v2); pai ...

  2. 论Pair的重要性

    这些天我在用React和D3做图表,从已经实现的图表里复制了一些坐标轴的代码,发现坐标轴上的n个点里,只有第一个点下面能渲染出文字提示,其余点下面都无法渲染出文字. 和组里的FL一起百思不得其解好几天 ...

  3. 2016 ACM/ICPC Asia Regional Dalian Online 1010 Weak Pair dfs序+分块

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  4. pair的使用

    #include<iostream> #include<cmath> #include<cstdio> #include<algorithm> #inc ...

  5. 【C++】pair

    STL的pair,有两个值,可以是不同的类型. template <class T1, class T2> struct pair; 注意,pair在头文件utility中,不要inclu ...

  6. hackerrank Similar Pair

    传送门 Problem Statement You are given a tree where each node is labeled from 1 to n. How many similar ...

  7. uva12546. LCM Pair Sum

    uva12546. LCM Pair Sum One of your friends desperately needs your help. He is working with a secret ...

  8. C++标准库 -- pair

    头文件:<utility> 可访问属性: first 第一个值 second 第二个值 可访问方法: swap(pair) 和另外一个pair交换值 其他相关方法: make_pair(v ...

  9. 2016 大连网赛---Weak Pair(dfs+树状数组)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 Problem Description You are given a rooted ...

  10. C++学习之Pair

    C++学习之Pair Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型, ...

随机推荐

  1. [jzoj 6086] [GDOI2019模拟2019.3.26] 动态半平面交 解题报告 (set+线段树)

    题目链接: https://jzoj.net/senior/#main/show/6086 题目: 题解: 一群数字的最小公倍数就是对它们质因数集合中的每个质因数的指数取$max$然后相乘 这样的子树 ...

  2. 关于markdown的使用

    首先: https://www.cnblogs.com/jordangong/p/9804777.html 注意:提交博客时需将 Markdown 源码粘贴到编辑器中,且编辑器没有实时预览,可以上传后 ...

  3. Nashorn——在JDK 8中融合Java与JavaScript之力--转

    原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性 ...

  4. JqGrid 查询时未设置初始页码导致的问题

    本文所述问题发生在查询的数据有至少2页数据时的情况下.本例中的产品质量查询就是这样. 第一步:查询该时间段内的数据,结果为13页的数据内容,显示当前页第1页.如下图所示: 第二步:点击翻页按钮,打开第 ...

  5. 向 wmware workstation pro 的 MS-DOS 操作系统中导入文件(masm debug edit)(详细图解)

    一般MS-DOS中不包含masm.debug和edit这三个程序. 我们想要把这几个文件导入到wmware workstation pro中的DOS虚拟机中怎么做呢? [尝试] 1.我试过用共享文件夹 ...

  6. Oracle查询当前用户下的所有表及sqlplus 设置 列宽

    如果oracle服务器中装有多个数据库实例,则在用户名处输入:用户名/密码@数据库名称.如果数据库服务器不在本机上,还需要加上数据库服务器的地址:用户名/密码@IP地址/数据库名称. [oracle@ ...

  7. Dapper Dapper-Extensions

    之前公司在开发项目的时候有用到过Dapper 仓储 以及IOC Castel .最近新项目上想使用上这些技术,决定新学习一下. 看了很多资料,发现几个比较容易菜鸟的我理解的,整理下来,找时间好好整理一 ...

  8. Python链表

    class Node: ''' 节点类 链表节点结构 data next data: 节点保存的数据 _next: 保存下一个节点对象 ''' def __init__(self, data, pne ...

  9. Linux CentOs6.5误卸载自带python和yum后的解决办法

    事故背景:前几天因项目需要,在服务器上搭建python-mysql模块,结果没安装好,于是乎想卸载重装,遂在网上查询卸载python的方法,结果一不小心直接把系统的python删了个干净....... ...

  10. 紫书 习题8-10 UVa 1614 (贪心+结论)

    这道题我苦思冥想了一个小时, 想用背包来揍sum/2, 然后发现数据太大, 空间存不下. 然后我最后还是去看了别人的博客, 发现竟然有个神奇的结论-- 幸好我没再钻研, 感觉这个结论我肯定是想不到的- ...