当前位置: 首页 > wzjs >正文

网站怎么做优化临沂森佳木业有限公司

网站怎么做优化,临沂森佳木业有限公司,网站建设项目执行进度表,钢筋网片价格多少钱一吨108. 冗余连接 卡码网题目链接(ACM模式)(opens new window) 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图)…

108. 冗余连接

卡码网题目链接(ACM模式)(opens new window)

题目描述

有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图:

现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图

先请你找出冗余边,删除后,使该图可以重新变成一棵树。

输入描述

第一行包含一个整数 N,表示图的节点个数和边的个数。

后续 N 行,每行包含两个整数 s 和 t,表示图中 s 和 t 之间有一条边。

输出描述

输出一条可以删除的边。如果有多个答案,请删除标准输入中最后出现的那条边。

输入示例

3
1 2
2 3
1 3

输出示例

1 3

提示信息

图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。但是 1 3 由于是标准输入里最后出现的那条边,所以输出结果为 1 3

数据范围:

1 <= N <= 1000.

我们就可以从前向后遍历每一条边(因为优先让前面的边连上),边的两个节点如果不在同一个集合,就加入集合(即:同一个根节点)。

如图所示,节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。

如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。

如图所示:

已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。

import java.util.Scanner;public class Main {private static int[] father;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int pointNum = scanner.nextInt();father = new int[pointNum + 1];init();for (int i = 0; i < pointNum; i++) {join(scanner.nextInt(), scanner.nextInt());}}/*** 并查集初始化*/private static void init() {for (int i = 1; i < father.length; i++) {// 让每个元素指向自己father[i] = i;}}/*** 并查集寻根** @param u* @return*/private static int find(int u) {// 判断 u 是否等于自己,如果是的话,直接返回自己// 如果不等于自己,就寻找根,寻找的时候,反复进行路径压缩return u == father[u] ? u : (father[u] = find(father[u]));}/*** 判断 u 和 v 是否同根** @param u* @param v* @return*/private static boolean isSame(int u, int v) {return find(u) == find(v);}/*** 添加 边 到并查集,v 指向 u** @param u* @param v*/private static void join(int u, int v) {// --if-- 如果两个点已经同根,说明他们的信息已经存储到并查集中了,直接返回即可// 寻找u的根int uRoot = find(u);// 寻找v的根int vRoot = find(v);if (uRoot == vRoot) {// --if-- 如果u,v的根相同,说明两者已经连接了,直接输出System.out.println(u + " " + v);return;}// --if-- 将信息添加到并查集father[vRoot] = uRoot;}}

109. 冗余连接II

卡码网题目链接(ACM模式)(opens new window)

题目描述

有一种有向树,该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。如图:

现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图:

输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。

输入描述

第一行输入一个整数 N,表示有向图中节点和边的个数。

后续 N 行,每行输入两个整数 s 和 t,代表这是 s 节点连接并指向 t 节点的单向边

输出描述

输出一条可以删除的边,若有多条边可以删除,请输出标准输入中最后出现的一条边。

输入示例

3
1 2
1 3
2 3

输出示例

2 3

提示信息

在删除 2 3 后有向图可以变为一棵合法的有向树,所以输出 2 3

数据范围:

1 <= N <= 1000.

本题的本质是 :有一个有向图,是由一颗有向树 + 一条有向边组成的 (所以此时这个图就不能称之为有向树),现在让我们找到那条边 把这条边删了,让这个图恢复为有向树。

还有“若有多条边可以删除,请输出标准输入中最后出现的一条边”,这说明在两条边都可以删除的情况下,要删顺序靠后的边!

我们来想一下 有向树的性质,如果是有向树的话,只有根节点入度为0,其他节点入度都为1(因为该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点)。

所以情况一:如果我们找到入度为2的点,那么删一条指向该节点的边就行了。

如图:

找到了节点3 的入度为2,删 1 -> 3 或者 2 -> 3 。选择删顺序靠后便可。

但 入度为2 还有一种情况,情况二,只能删特定的一条边,如图:

节点3 的入度为 2,但在删除边的时候,只能删 这条边(节点1 -> 节点3),如果删这条边(节点4 -> 节点3),那么删后本图也不是有向树了(因为找不到根节点)。

综上,如果发现入度为2的节点,我们需要判断 删除哪一条边,删除后本图能成为有向树。如果是删哪个都可以,优先删顺序靠后的边。

情况三: 如果没有入度为2的点,说明 图中有环了(注意是有向环)。

如图:

对于情况三,删掉构成环的边就可以了。

import java.util.*;/* * 冗余连接II。主要问题是存在入度为2或者成环,也可能两个问题同时存在。* 1.判断入度为2的边 * 2.判断是否成环(并查集)*/public class Main {/*** 并查集模板*/static class Disjoint {private final int[] father;public Disjoint(int n) {father = new int[n];for (int i = 0; i < n; i++) {father[i] = i;}}public void join(int n, int m) {n = find(n);m = find(m);if (n == m) return;father[n] = m;}public int find(int n) {return father[n] == n ? n : (father[n] = find(father[n]));}public boolean isSame(int n, int m) {return find(n) == find(m);}}static class Edge {int s;int t;public Edge(int s, int t) {this.s = s;this.t = t;}}static class Node {int id;int in;int out;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();List<Edge> edges = new ArrayList<>();Node[] nodeMap = new Node[n + 1];for (int i = 1; i <= n; i++) {nodeMap[i] = new Node();}Integer doubleIn = null;for (int i = 0; i < n; i++) {int s = scanner.nextInt();int t = scanner.nextInt();//记录入度nodeMap[t].in++;if (!(nodeMap[t].in < 2)) doubleIn = t;Edge edge = new Edge(s, t);edges.add(edge);}Edge result = null;//存在入度为2的节点,既要消除入度为2的问题同时解除可能存在的环if (doubleIn != null) {List<Edge> doubleInEdges = new ArrayList<>();for (Edge edge : edges) {if (edge.t == doubleIn) doubleInEdges.add(edge);if (doubleInEdges.size() == 2) break;}Edge edge = doubleInEdges.get(1);if (isTreeWithExclude(edges, edge, nodeMap)) {result = edge;} else {result = doubleInEdges.get(0);}} else {//不存在入度为2的节点,则只需要解除环即可result = getRemoveEdge(edges, nodeMap);}System.out.println(result.s + " " + result.t);}public static boolean isTreeWithExclude(List<Edge> edges, Edge exculdEdge, Node[] nodeMap) {Disjoint disjoint = new Disjoint(nodeMap.length + 1);for (Edge edge : edges) {if (edge == exculdEdge) continue;//成环则不是树if (disjoint.isSame(edge.s, edge.t)) {return false;}disjoint.join(edge.s, edge.t);}return true;}public static Edge getRemoveEdge(List<Edge> edges, Node[] nodeMap) {int length = nodeMap.length;Disjoint disjoint = new Disjoint(length);for (Edge edge : edges) {if (disjoint.isSame(edge.s, edge.t)) return edge;disjoint.join(edge.s, edge.t);}return null;}}

http://www.dtcms.com/wzjs/292819.html

相关文章:

  • 广东平台网站建设找哪家注册网站在哪里注册
  • 上海有哪些网站设计公司江苏seo推广
  • 美国cn2独立ip站群服务器seo案例视频教程
  • 自媒体网站源码模板dede今日头条新闻最全新消息
  • 深圳企业排名吉林seo基础知识
  • 南昌网页制作公司2022年seo最新优化策略
  • 做片子 我们是认真的网站广州seo网站公司
  • 个人网页设计html代码免费网站seo关键词优化技巧
  • 邢台企业网站制作建设极速一区二区三区精品
  • 网站修改需要什么市场营销活动策划方案
  • 今日武汉疫情行程公布外贸推广优化公司
  • 旅游网站建设费用预算网上营销推广
  • 上海网站制作官网罗湖区seo排名
  • 杭州网站建设nuoweb搜素引擎优化
  • 小微企业生产管理软件抖音优化
  • 上海集团网站建设公司好百度关键词优化软件排名
  • 手机上有那种网站吗成都seo正规优化
  • 商城网站建设特点有哪些影响seo排名的因素有哪些
  • 做网站的公司哪些靠谱sem推广什么意思
  • 昆明网站建设解决方案在线客服
  • 网站备案号没有-1如何做网站营销推广
  • 顺德做网站公司爱站网站
  • 中国建设网官网住房和城乡建设官网关键词优化课程
  • 阳江网站建设怎样留别人电话在广告上
  • 商会网站制作sem竞价专员是干什么的
  • 网站上微信支付功能网页制作步骤
  • 搭建网站 开源软件bing搜索引擎国内版
  • 郑州信息网平台青岛官网seo方法
  • 网站备案信息查询网站优化有哪些技巧
  • 西安网站制作开发公司不能搜的超级恶心的关键词