AcWing 847. 图中点的层次
原题链接
简单
作者:
JAVA小老弟
,
2020-01-29 22:49:30
,
所有人可见
,
阅读 548
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main{
static int[] e=new int[100100];//插入一种关系 存入结点值
static int[] ne=new int[100100];//插入一种关系 存入这个结点值的下一个指向 类似哈希
static int[] dg=new int[100100];//判断这个结点是否被遍历过了 默认为0
static int idx=0;//index 对e和ne进行操作
static int[] juli=new int[100100];//存储BFS过程中的最短路径
static int[] h=new int[100100];//每个结点存储自己的指向
static List<Integer> res=new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader r=new BufferedReader(new InputStreamReader(System.in));
String s[]=r.readLine().split(" ");
int n=Integer.parseInt(s[0]);
int m=Integer.parseInt(s[1]);
for (int i = 1; i <=n ; i++) {
h[i]=-1;//全部指向-1
}
for (int i = 0; i <m ; i++) {
String line[]=r.readLine().split(" ");
int a=Integer.parseInt(line[0]);
int b=Integer.parseInt(line[1]);
add(a,b);//添加a指向b的关系
}
res.add(1);//模拟队列
while(res.size()!=0){
int a=res.remove(0);
bfs(a);
}
if(juli[n]==0)//如果距离没有说明到不了
System.out.println("-1");
else
System.out.println(juli[n]);
}
public static void add(int x,int y){
e[idx]=y;//在对应的结点处插入链表,并且index+=1;
ne[idx]=h[x];
h[x]=idx;
idx+=1;
}
public static void bfs(int x){//从结点x 开始 主函数必须从1开始 题目要1-n的距离
for (int i = h[x]; i !=-1; i=ne[i]) {
int tar=e[i];
if(dg[tar]==0){
dg[tar]=1;
juli[tar]=juli[x]+1;
res.add(tar);
}
}
}
}