-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathf.cpp
45 lines (40 loc) · 939 Bytes
/
f.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <bits/stdc++.h>
#define endl "\n"
#define moo cout
using namespace std;
const int MOD = 1e9+7;
int N, M, par[500000], sz[500000];
int find(int u){
if(par[u] == u) return u;
return (par[u] = find(par[u]));
}
void un(int u, int v){
u = find(u), v = find(v);
if(u == v) return;
if(sz[u] > sz[v]) swap(u, v);
sz[v] += sz[u];
par[u] = v;
}
int32_t main(){
cin.tie(0) -> sync_with_stdio(0);
cin >> N >> M;
fill(sz, sz+M+1, 1);
iota(par, par+M+1, 0);
vector<int> s;
for(int i = 0; i < N; i++){
int k; cin >> k;
int a, b = M+1; cin >> a;
if(k == 2) cin >> b;
if(find(--a) != find(--b)){
un(a, b);
s.push_back(i);
}
}
int ans = 1;
for(int i = 0; i < (int)s.size(); i++) ans = ans * 2 % MOD;
moo << ans << " " << s.size() << endl;
for(int i : s){
moo << i+1 << " ";
}
moo << endl;
}