K2. MST(a.k.a. Most Stupid Technique)

Codeforces
IDCFK2
Time1000ms
Memory256MB
Difficulty
English · Original
Chinese · Translation
Formal · Original
During a programming contest, Mr. Search Tree (a.k.a. MST) forgot how to implement Kruskal's and Prim's algorithms. In a moment of desperation, he wrote a DFS that always follows the smallest available edge first. Strangely enough, it passed. Now he wonders: for which starting nodes does his "Most Stupid Technique" accidentally produce a correct minimum spanning tree$""^dagger$ ? Formally, given a connected undirected graph with $n$ nodes and $m$ edges, the $i$-th edge has weight $i$, and here is the algorithm he used: In other words, _findMST(u)_ performs a DFS starting from vertex $u$, always choosing the smallest-weight unvisited edge from the current node and includes it in the tree. Although this always produces a spanning tree, it doesn't always yield a minimum one. Your task is to determine, for each node $i$ from $1$ to $n$, whether _findMST(i)_ returns a minimum spanning tree. $""^dagger$ A minimum spanning tree (MST) of a connected undirected graph is a subset of the edges that forms a tree connecting all the vertices and has the minimum possible total edge weight among all such trees. The first line contains two integers $n$ and $m$ ($2 <= n <= 10^5, n -1 <= m <= 2 dot.op 10^5$), denoting the number of vertices and edges. For the following $m$ lines, the $i$-th line contains two integers $u_i$ and $v_i$ ($1 <= u_i, v_i <= n, u_i eq.not v_i$), denoting an undirected edge between $u_i$ and $v_i$. The $i$-th edge ($1$-based index in input) has weight $i$. It's guaranteed that the graph is connected and contains no duplicate edges. Output one line containing a binary string of length $n$. The i-th character should be '$1$'(without quotes) if the tree produced by running the algorithm above starting from node i is a minimum spanning tree, and '$0$'(without quotes) otherwise. The sample case is shown below: The graph for the sample The only minimum spanning tree (MST) of this graph includes the edges with weights $1$, $2$, $4$, and $5$, which has a total edge weight of 12. We simulate the algorithm _findMST(u)_ for each $u$ from $1$ to $5$: Thus, the output is _01111_. ## Input The first line contains two integers $n$ and $m$ ($2 <= n <= 10^5, n -1 <= m <= 2 dot.op 10^5$), denoting the number of vertices and edges. For the following $m$ lines, the $i$-th line contains two integers $u_i$ and $v_i$ ($1 <= u_i, v_i <= n, u_i eq.not v_i$), denoting an undirected edge between $u_i$ and $v_i$.The $i$-th edge ($1$-based index in input) has weight $i$.It's guaranteed that the graph is connected and contains no duplicate edges. ## Output Output one line containing a binary string of length $n$.The i-th character should be '$1$'(without quotes) if the tree produced by running the algorithm above starting from node i is a minimum spanning tree, and '$0$'(without quotes) otherwise. [samples] ## Note The sample case is shown below: The graph for the sample The only minimum spanning tree (MST) of this graph includes the edges with weights $1$, $2$, $4$, and $5$, which has a total edge weight of 12.We simulate the algorithm _findMST(u)_ for each $u$ from $1$ to $5$: _findMST(1)_ starts from node $1$ and visits edge $1$ first (to node $2$). Then at node $2$, the smallest unvisited adjacent edge is edge $3$ (to node $3$), so it is selected instead of edge $2$. As a result, edge $3$ (which has higher weight than edge $2$) is included in the result, and the resulting tree includes the edges with weights $1$, $3$, $4$, and $5$, which has a total edge weight of 13; so it doesn't construct the MST of the graph. _findMST(2)_, _findMST(3)_, _findMST(4)_, and _findMST(5)_ all happen to construct the correct MST. Thus, the output is _01111_.
在一次编程竞赛中,Mr. Search Tree(又称 MST)忘记了如何实现 Kruskal 算法和 Prim 算法。在绝望之际,他写了一个 DFS,总是优先选择当前节点可用的最小边。奇怪的是,它通过了。 现在他想知道:对于哪些起始节点,他的“最愚蠢技巧”会偶然产生正确的最小生成树$""^dagger$? 形式化地,给定一个包含 $n$ 个节点和 $m$ 条边的连通无向图,第 $i$ 条边的权重为 $i$,他使用的算法如下: 换句话说,_findMST(u)_ 从顶点 $u$ 开始执行 DFS,始终从当前节点选择权重最小的未访问边,并将其加入树中。 尽管该算法总是生成一棵生成树,但并不总是生成最小生成树。 你的任务是确定对于每个节点 $i$(从 $1$ 到 $n$),_findMST(i)_ 是否返回一个最小生成树。 $""^dagger$ 一个连通无向图的最小生成树(MST)是指一组边的子集,它构成一棵连接所有顶点的树,且在所有此类树中具有最小的总边权。 第一行包含两个整数 $n$ 和 $m$($2 lt.eq n lt.eq 10^5, n -1 lt.eq m lt.eq 2 dot.op 10^5$),分别表示顶点数和边数。 接下来的 $m$ 行中,第 $i$ 行包含两个整数 $u_i$ 和 $v_i$($1 lt.eq u_i, v_i lt.eq n, u_i eq.not v_i$),表示 $u_i$ 和 $v_i$ 之间的无向边。 第 $i$ 条边(输入中基于 1 的索引)的权重为 $i$。 保证图是连通的,且不包含重复边。 输出一行,包含一个长度为 $n$ 的二进制字符串。 第 $i$ 个字符应为 '$1$'(不带引号),如果从节点 $i$ 开始运行上述算法所生成的树是最小生成树;否则为 '$0$'(不带引号)。 样例情况如下所示: 样例图 该图唯一的最小生成树(MST)包含权重为 $1$、$2$、$4$ 和 $5$ 的边,总边权为 12。 我们对每个 $u$ 从 $1$ 到 $5$ 模拟 _findMST(u)_: 因此,输出为 _01111_。 ## Input 第一行包含两个整数 $n$ 和 $m$($2 lt.eq n lt.eq 10^5, n -1 lt.eq m lt.eq 2 dot.op 10^5$),表示顶点数和边数。接下来的 $m$ 行中,第 $i$ 行包含两个整数 $u_i$ 和 $v_i$($1 lt.eq u_i, v_i lt.eq n, u_i eq.not v_i$),表示 $u_i$ 和 $v_i$ 之间的无向边。第 $i$ 条边(输入中基于 1 的索引)的权重为 $i$。保证图是连通的,且不包含重复边。 ## Output 输出一行,包含一个长度为 $n$ 的二进制字符串。第 $i$ 个字符应为 '$1$'(不带引号),如果从节点 $i$ 开始运行上述算法所生成的树是最小生成树;否则为 '$0$'(不带引号)。 [samples] ## Note 样例情况如下所示:样例图 该图唯一的最小生成树(MST)包含权重为 $1$、$2$、$4$ 和 $5$ 的边,总边权为 12。 我们对每个 $u$ 从 $1$ 到 $5$ 模拟 _findMST(u)_: _findMST(1)_ 从节点 $1$ 开始,首先访问边 $1$(到节点 $2$)。然后在节点 $2$,最小的未访问邻接边是边 $3$(到节点 $3$),因此选择它而非边 $2$。结果,边 $3$(其权重高于边 $2$)被包含在结果中,最终生成的树包含权重为 $1$、$3$、$4$ 和 $5$ 的边,总边权为 13;因此它没有构造出图的 MST。 _findMST(2)_、_findMST(3)_、_findMST(4)_ 和 _findMST(5)_ 都恰好构造出了正确的 MST。因此,输出为 _01111_。
**Definitions** Let $ G = (V, E) $ be a connected undirected graph with $ |V| = n $, $ |E| = m $. For $ i \in \{1, \dots, m\} $, edge $ e_i = (u_i, v_i) \in E $ has weight $ w(e_i) = i $. Let $ \text{findMST}(u) $ denote the DFS traversal starting at node $ u $, at each step selecting the smallest-weight unvisited edge incident to the current node, and including it in the constructed tree. Let $ T_u $ be the spanning tree produced by $ \text{findMST}(u) $. Let $ T^* $ be a minimum spanning tree of $ G $ (unique due to distinct edge weights). **Constraints** 1. $ 2 \le n \le 10^5 $ 2. $ n - 1 \le m \le 2 \cdot 10^5 $ 3. All edge weights are distinct and equal to their 1-based input index. 4. The graph is connected and has no duplicate edges. **Objective** For each node $ i \in \{1, \dots, n\} $, determine whether $ T_i = T^* $. Output a binary string $ s $ of length $ n $, where: $$ s[i] = \begin{cases} 1 & \text{if } T_i = T^* \\ 0 & \text{otherwise} \end{cases} $$
API Response (JSON)
{
  "problem": {
    "name": "K2. MST(a.k.a. Most Stupid Technique)",
    "description": {
      "content": "During a programming contest, Mr. Search Tree (a.k.a. MST) forgot how to implement Kruskal's and Prim's algorithms. In a moment of desperation, he wrote a DFS that always follows the smallest availabl",
      "description_type": "Markdown"
    },
    "platform": "Codeforces",
    "limit": {
      "time_limit": 1000,
      "memory_limit": 262144
    },
    "difficulty": "None",
    "is_remote": true,
    "is_sync": true,
    "sync_url": null,
    "sign": "CFK2"
  },
  "statements": [
    {
      "statement_type": "Markdown",
      "content": "During a programming contest, Mr. Search Tree (a.k.a. MST) forgot how to implement Kruskal's and Prim's algorithms. In a moment of desperation, he wrote a DFS that always follows the smallest availabl...",
      "is_translate": false,
      "language": "English"
    },
    {
      "statement_type": "Markdown",
      "content": "在一次编程竞赛中,Mr. Search Tree(又称 MST)忘记了如何实现 Kruskal 算法和 Prim 算法。在绝望之际,他写了一个 DFS,总是优先选择当前节点可用的最小边。奇怪的是,它通过了。\n\n现在他想知道:对于哪些起始节点,他的“最愚蠢技巧”会偶然产生正确的最小生成树$\"\"^dagger$?\n\n形式化地,给定一个包含 $n$ 个节点和 $m$ 条边的连通无向图,第 $i$ 条边的...",
      "is_translate": true,
      "language": "Chinese"
    },
    {
      "statement_type": "Markdown",
      "content": "**Definitions**  \nLet $ G = (V, E) $ be a connected undirected graph with $ |V| = n $, $ |E| = m $.  \nFor $ i \\in \\{1, \\dots, m\\} $, edge $ e_i = (u_i, v_i) \\in E $ has weight $ w(e_i) = i $.  \n\nLet $...",
      "is_translate": false,
      "language": "Formal"
    }
  ]
}
Full JSON Raw Segments