输入样例:
10 11
3 2 3 4
1 6
3 4 7 5
1 3
1 9
2 3 5
3 1 8 5
1 9
2 8 10
0
1 1
0 3
0 1
1 2
0 2
0 2
2 2
0 3
0 1
1 1
0 2
输出样例:
1
3
9
10
样例解释:
简单给出样例中经过的剧情点顺序:
1 -> 4 -> 3 -> 7 -> 8 -> 3 -> 5 -> 9 -> 10。
档位 1 开始存的是 1 号剧情点;档位 2 存的是 3 号剧情点;档位 1 后来又存了 9 号剧情点。
解题思路:
这道题题意有点难懂,不认真读看完也不知道到说了个啥意思。。
意思是做某个操作或选择可以走到这个顶点的第某个邻接边上,对图的存储可以用数组模拟邻接表,集合式的二维数组存储图,数组套集合存储图,其中将数组套进集合中速度最快,内存最少。另外再读取数据时,如果仅仅用bufferedreader,可能会因为中间产生大量字符串而导致内存超限,对于这种仅仅涉及整型数据的读取可以用streamtokenizer快读,效率很高。
Java代码:(数组模拟邻接表)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
public class Main {
static final int M = 1000005;
static final int N = 100005;
static int []e = new int[M];
static int []ne = new int[M];
static int []h = new int[N];
static int []w = new int[N];
static int idx;
static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static int ini() throws IOException {
st.nextToken();
return (int)st.nval;
}
public static void main(String[] args) throws IOException {
int n = ini(), m = ini();
Arrays.fill(h, -1);
for(int i = 1; i <= n; i++) {
int k = ini();
w[i] = k;
for(int j = 1; j <= k; j++)
add(i, ini());
}
int st = 1;
int []arr = new int [105];
StringBuilder ans = new StringBuilder();
while(m-- > 0) {
int a = ini(), b = ini();
if(a == 0) {
int cnt = 0, x = st;
for(int i = h[st]; i != -1 ; i = ne[i]) {
st = e[i];
cnt++;
if(cnt == w[x] - b + 1) break;
}
}else if(a == 1) {
arr[b] = st;
ans.append(st + "\n");
}else {
st = arr[b];
}
}
ans.append(st);
System.out.print(ans.toString());
}
public static void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
}
运行结果:
Java代码:(集合模拟邻接表)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
public class Main {
static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static int ini() throws IOException {
st.nextToken();
return (int)st.nval;
}
public static void main(String[] args) throws IOException {
int n = ini(), m = ini();
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
list.add(new ArrayList<>());
for(int i = 1; i <= n; i++) {
int k = ini();
ArrayList<Integer> l = new ArrayList<>();
for(int j = 1; j <= k; j++)
l.add(ini());
list.add(l);
}
int st = 1;
int []arr = new int [105];
StringBuilder ans = new StringBuilder();
while(m-- > 0) {
int a = ini(), b = ini();
if(a == 0) {
b--;
st = list.get(st).get(b);
}else if(a == 1) {
arr[b] = st;
ans.append(st + "\n");
}else {
st = arr[b];
}
}
ans.append(st);
System.out.print(ans.toString());
}
}
运行结果:
Java代码:(数组套进集合模拟邻接表)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
public class Main {
static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static int ini() throws IOException {
st.nextToken();
return (int)st.nval;
}
static class Edge{
int []edg;
public Edge(int[] edg) {
this.edg = edg;
}
}
public static void main(String[] args) throws IOException {
int n = ini(), m = ini();
ArrayList<Edge> list = new ArrayList<>();
int []aa = new int[1];
list.add(new Edge(aa));
for(int i = 1; i <= n; i++) {
int k = ini();
int []arr = new int[k + 1];
for(int j = 1; j <= k; j++)
arr[j] = ini();
list.add(new Edge(arr));
}
int st = 1;
int []arr = new int [105];
StringBuilder ans = new StringBuilder();
while(m-- > 0) {
int a = ini(), b = ini();
if(a == 0) {
st = list.get(st).edg[b];
}else if(a == 1) {
arr[b] = st;
ans.append(st + "\n");
}else {
st = arr[b];
}
}
ans.append(st);
System.out.print(ans.toString());
}
}
运行结果: