题意:
891C. Envy
time limit per test: 2 seconds
memory limit per test: 256 megabytes
input: standard input
output: standard output
For a connected undirected weighted graph $G$, MST (minimum spanning tree) is a subgraph of $G$ that contains all of $G$’s vertices, is a tree, and sum of its edges is minimum possible.
You are given a graph $G$. If you run a MST algorithm on graph it would give you only one MST and it causes other edges to become jealous. You are given some queries, each query contains a set of edges of graph $G$, and you should determine whether there is a MST containing all these edges or not.
Input
The first line contains two integers $n$, $m$ (2≤$n$,$m$≤5·10$^5$, $n$-1≤$m$) — the number of vertices and edges in the graph and the number of queries.
The $i$-th of the next $m$ lines contains three integers $ui$, $vi$, $wi$ ($ui$≠$vi$, 1≤$wi$≤5·10$^5$) — the endpoints and weight of the $i$-th edge. There can be more than one edges between two vertices. It’s guaranteed that the given graph is connected.
The next line contains a single integer $q$ (1≤$q$≤5·10$^5$) — the number of queries.
$q$ lines follow, the $i$-th of them contains the $i$-th query. It starts with an integer $ki$ (1≤$ki$≤$n$-1) — the size of edges subset and continues with $ki$ distinct space-separated integers from 1 to $m$ — the indices of the edges. It is guaranteed that the sum of $ki$ for 1≤$i$≤$q$ does not exceed 5·10$^5$.
Output
For each query you should print “YES” (without quotes) if there’s a MST containing these edges and “NO” (of course without quotes again) otherwise.
Example
input |
---|
5 7 |
1 2 2 |
1 3 2 |
2 3 1 |
2 4 1 |
3 4 1 |
3 5 2 |
4 5 2 |
4 |
2 3 4 |
3 3 4 5 |
2 1 7 |
2 1 2 |
output |
---|
YES |
NO |
YES |
NO |
题解:
看来lz太弱了,此题被初二大佬yht水过。
主要是要想到离线处理。把所有询问的边从小到大考虑,每次考虑一堆相同权值的边。
假如当前边的权值为x,则小于x的所有边都已经进行过了kruskal,加进了并查集。
对含有权值为x的询问,我们将其中所有权值为x的加入并查集,若出现环,则”NO”。
然后要将本次操作涉及的合并还原(重要!)。
在完成所有有权值为x的询问后,将这些边真正的加入并查集。
复杂度$O(mlogm+\sum ki)$
//函数递归的函数名不能写错啊~~
代码:
|
|
欢迎转载或引用,能附上lz的网址就更好啦