QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#604084#3846. Link-Cut TreeLJY_ljyAC ✓85ms42480kbC++112.0kb2024-10-01 22:58:072024-10-01 22:58:07

Judging History

你现在查看的是最新测评结果

  • [2024-10-01 22:58:07]
  • 评测
  • 测评结果:AC
  • 用时:85ms
  • 内存:42480kb
  • [2024-10-01 22:58:07]
  • 提交

answer

///警钟敲烂*inf: 没有返回值的函数一定要写成 void 类型,否则会出现 Undefined Behaviour 然后 RE!(这时本地AC) 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

const long long MAXN = 1e6 + 10;
const long long MAXM = 1e6 + 10;

inline long long read() {
	long long x = 0, f = 1;
	char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
} 

struct node {
	long long to, index;
};

long long n, m, G[MAXM][2], fa[MAXN];
vector<node> G2[MAXN];

long long find(long long x) {
	if (x == fa[x]) return x;
	return fa[x] = find(fa[x]);
}

void unite(long long x, long long y) {
	long long X = find(x);
	long long Y = find(y);
	if (X != Y) fa[X] = Y;
}

long long Start, End;
bool used[MAXM], Used[MAXM];

void dfs(long long u) {
	if (u == End) {
		for (long long i = 1; i <= m; i++)
			Used[i] = used[i];
		return;
	}
	for (long long i = 0; i < G2[u].size(); i++) {
		if (!used[G2[u][i].index]) {
			used[G2[u][i].index] = true;
			dfs(G2[u][i].to);
			used[G2[u][i].index] = false;
		}
	}
}

int main() {
	long long t = read();
	for (long long u = 1; u <= t; u++) {
		n = read(); m = read();
		for (long long i = 1; i <= m; i++) {
			G[i][0] = read();
			G[i][1] = read();	
			used[i] = false;
			Used[i] = false;
		}
		for (long long i = 1; i <= n; i++) {
			fa[i] = i;
			G2[i].clear();
		}
		long long Maxx = -1;
		for (long long i = 1; i <= m; i++) {
			if (find(G[i][0]) == find(G[i][1])) {
				Maxx = i;
				break;
			}
			unite(G[i][0], G[i][1]);
			G2[G[i][0]].push_back((node){G[i][1], i});
			G2[G[i][1]].push_back((node){G[i][0], i}); 
		} 
		if (Maxx == -1) printf("-1\n");
		else {
			Start = G[Maxx][0], End = G[Maxx][1];
			dfs(Start);
			for (long long i = 1; i < Maxx; i++) {
				if (Used[i]) 
					printf("%d ", i);
			}
			printf("%d\n", Maxx);
		}
	}
	return 0;
} 

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 30400kb

input:

2
6 8
1 2
2 3
5 6
3 4
2 5
5 4
5 1
4 2
4 2
1 2
4 3

output:

2 4 5 6
-1

result:

ok 2 lines

Test #2:

score: 0
Accepted
time: 68ms
memory: 41132kb

input:

1658
9 20
6 4
5 8
1 7
2 3
3 8
3 1
4 8
5 3
7 6
1 6
4 9
4 1
9 3
2 5
4 5
8 9
1 8
4 2
5 7
3 6
14 78
13 12
10 8
2 10
6 13
2 14
13 1
14 10
9 6
2 13
8 3
9 8
5 6
14 12
8 1
9 14
9 5
12 6
5 10
3 12
10 4
8 5
9 10
6 8
1 6
12 4
3 13
1 5
10 3
13 9
10 13
2 5
4 7
7 1
7 6
9 3
2 12
1 10
9 1
1 14
3 1
3 4
11 1
11 6
7 1...

output:

2 5 8
3 5 7
1 3 4
2 3 4
2 3 4 7 13
1 3 4 5 9
3 4 7 12
1 2 3
8 10 11
2 3 5 7 12 13 14 15 16
1 2 3 5
1 2 4
1 3 4
1 2 3
1 2 3
10 11 15
1 5 6
1 5 7
1 2 3 4
-1
1 3 6
-1
1 2 3 5
-1
-1
6 8 9 10 11 16
1 2 6
2 3 4
-1
-1
7 8 12 13 18
-1
1 4 8 12
3 5 10
4 6 8
1 2 3 4
3 5 6
5 8 10 15
4 6 8
-1
1 2 3 5 6
1 3 4
1 ...

result:

ok 1658 lines

Test #3:

score: 0
Accepted
time: 85ms
memory: 42480kb

input:

10
100000 100000
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50 51
...

output:

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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 ...

result:

ok 10 lines