您的位置:首页 > 其它

spfa模板(链式前向星,bfs,判环)

2018-04-03 16:46 465 查看
说起来我该印一份自己的模板了。

public class Main {
static Set<Integer> visited = new HashSet<>();
static Edge[] edges = new Edge[1005];
static int[] head = new int[1005];
static int[] dis = new int[1005];
static int[] judege = new int[1005];//记录入队次数
static final int maxIn = 998;//最大入队次数,看情况

public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
// InputReader reader = new InputReader();
// PrintWriter out = new PrintWriter(System.out);
int t = reader.nextInt();
int n = reader.nextInt();
int index = 0;
Arrays.fill(head, -1);
Arrays.fill(dis, Integer.MAX_VALUE);
for (int i = 0; i < n; i++) {
int f
4000
rom = reader.nextInt();
int to = reader.nextInt();
int val = reader.nextInt();
edges[index] = new Edge(to, val, head[from]);
head[from] = index++;
}
spfa(1);
System.out.println(dis
);
}

public static void spfa(int s) {
Queue<Integer> wait = new LinkedList<>();
wait.add(s);
visited.add(s);
dis[s] = 0;
while (!wait.isEmpty()) {
int get = wait.poll();
for (int i = head[get]; i != -1; i = edges[i].next) {
int road = dis[get] + edges[i].val;
if (road < dis[edges[i].to]) {
dis[edges[i].to] = road;
if (visited.add(edges[i].to)) {
wait.add(edges[i].to);
judege[get]++;
if(judege[get]>maxIn) {
//有负环,处理
return;
}
}
}
}
}
}
}

class Edge {
int to;
int val;
int next;

public Edge(int to, int val, int next) {
this.to = to;
this.val = val;
this.next = next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: