并查集
例题:格子游戏
【输入样例】
3 5
1 1 D
1 1 R
1 2 D
2 1 R
2 2 D
【输出样例】
4
————————————————————————————————————————————————————
import java.util.Scanner;
public class Main {
static int N = 40010;
static int n;
static int m;
static int[] p = new int[N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
for (int i = 0; i < n * n; i++) {
p[i] = i;
}
int res = 0;
for (int i = 1; i <= m; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
char d = sc.next().charAt(0);
x--;
y--;
int a = get(x, y);
int b;
if (d == 'D') {
b = get(x + 1, y);
} else {
b = get(x, y + 1);
}
int pa = find(a);
int pb = find(b);
if (pa == pb) {
//死循环
res = i;
break;
}
p[pa] = pb;
}
if (res == 0) {
System.out.println("draw");
} else {
System.out.println(res);
}
}
private static int get(int x, int y) {
return x * n + y;
}
private static int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
}
例题:搭配购买(buy)
【输入样例】
5 3 10
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2
【输出样例】
1
【提示】
【数据范围】
30%的数据保证:n≤100;
50%的数据保证:n≤1,000;m≤100;w≤1,000;
100%的数据保证:n≤10,000;0≤m≤5000;w≤10,000。
——————————————————————————————————————————————————————
import java.util.Scanner;
public class Main {
static int N = 10010;
static int n;
static int m;
static int vol;
static int[] v = new int[N];
static int[] w = new int[N];
static int[] p = new int[N];
static int[] f