创建网站代码是什么问题,网站开发合同书,网页设计入门图片,高校文明建设网站【华为OD】B\C卷真题#xff1a;100%通过#xff1a;找城市 C/C实现 题目描述#xff1a;
一张地图上有n个城市#xff0c;城市和城市之间有且只有一条道路相连#xff1a;要么直接相连#xff0c;要么通过其它城市中转相连#xff08;可中转一次或多次#xff09;。…【华为OD】B\C卷真题100%通过找城市 C/C实现 题目描述
一张地图上有n个城市城市和城市之间有且只有一条道路相连要么直接相连要么通过其它城市中转相连可中转一次或多次。城市与城市之间的道路都不会成环。
当切断通往某个城市 i 的所有道路后地图上将分为多个连通的城市群设该城市 i 的聚集度为 DPiDegree of Polymerization, DPi max(城市群1的城市个数 城市群2的城市个数, ... 城市群m的城市个数)。 请找出地图上 DP 值最小的城市即找到城市 j使得 DPj min(DP1, DP2 ... DPn) )
提示如果有多个城市都满足条件这些城市都要找出来可能存在多个解
提示DPi 的计算可以理解为已知一棵树删除某个节点后生成的多个子树求解多个子树节点数的问题。
输入描述
每个样例第一行有一个整数N表示有N个节点。1N1000
接下来的N-1行每行有两个整数x,y表示城市x与城市y连接。1x, yN
输出描述
输出城市的编号。如果有多个按照编号升序输出。
示例1
输入输出示例仅供调试后台判题数据一般不包含示例
输入 5 1 2 2 3 3 4 4 5 输出 3 说明
输入表示的是如下地图 对于城市3切断通往3的所有道路后形成2个城市群[1,2,4,5]其聚集度分别都是2。DP3 2。 对于城市4切断通往城市4的所有道路后 形成2个城市群[ (1,2,3), (5) ]DP4 max3, 1 3 。依次类推切断其它城市的所有道路后得到的DP都会大于2因为城市3就是满足条件的城市输出是3。
示例2
输入输出示例仅供调试后台判题数据一般不包含示例
输入 6 1 2 2 3 2 5 3 4 3 6 输出 2 3 说明
输入表示的是如下地图 切断通往2的所有道路后形成3个城市群[1,53,4,6]其聚集度分别都是1、1、3因此DP2 3。
切断通往3的所有道路后形成3个城市群[12,5,4,6]其聚集度分别都是3、1、1因此DP3 3。
切断其它城市的所有道路后得到的DP都会大于3因为城市2、3就是满足条件的城市升序排列输出是2 3 解题思路 其实就是构建多叉树来实现即可 代码实现
#include iostream
#include vector
#include string
#include algorithm
#include mapusing namespace std;struct Node {int val;int par;vectorNode * childs;
};void sort(vectorint xPos, vectorint yPos, int n) {for (int i 0; i n; i) {if (xPos[i] yPos[i]) {swap(xPos[i], yPos[i]);}}for (int i 0; i n; i) {for (int j 0; j n - i - 1; j) {if ((xPos[i] xPos[i 1]) || (xPos[i] xPos[i 1] yPos[i] yPos[i 1])) {swap(xPos[i], xPos[i 1]);swap(yPos[i], yPos[i 1]);}}}
}void mergeNode(Node *pCity, Node *cCity) {cCity-par pCity-val;pCity-childs.push_back(cCity);for (Node *city : cCity-childs) {city-par pCity-val;pCity-childs.push_back(city);}cCity-childs.clear();
}int main() {int n;cin n;vectorint xPos(n, 0);vectorint yPos(n, 0);for (int i 1; i n; i) {cin xPos[i] yPos[i];}if (n 1) {cout 1 endl;}else if (n 2) {cout 1 endl;cout 2 endl;}else {sort(xPos, yPos, n);int min 1008;int max;int totalCity;vectorint minArr;for (int i 1; i n; i) {vectorNode * citys(n 1);max 0;for (int j 1; j n; j) {Node *city new Node();city-par j;city-val j;citys[j] city;}for (int j 1; j n; j) {if (xPos[j] i || yPos[j] i) {continue;}Node *yCity citys[yPos[j]];Node *xCity citys[xPos[j]];if (xCity-par ! xCity-val) {xCity citys[xCity-par];}if (yCity-par yCity-val) {mergeNode(xCity, yCity);}else {Node *yCityParent citys[yCity-par];mergeNode(xCity, yCityParent);}}for (int j 1; j n; j) {if (citys[j]-par citys[j]-val) {totalCity citys[j]-childs.size() 1;max max totalCity ? totalCity : max;}}if (min max) {min max;minArr.clear();minArr.push_back(i);}else if (min max) {minArr.push_back(i);}for (int m 0; m citys.size(); m) {delete citys[m];}}string ans ;for (int k 0; k minArr.size(); k) {ans to_string(minArr[k]) ;}cout ans endl;}
}