[Algorithm] SWEA_최소스패닝트리

간선 많으면 프림 간선 적으면 크루스칼 간만프 간적쿠 - by 효인샘 21 47 48 36 47 이거도 외우자.(2147483647)

방문처리 하고 넣는게 bfs의 기본인데(무조건 방문처리) pq일때는 방문처리하면 큰일 난다. 왜? pq에서 이미 순서대로 처리해 그렇다.

일반 큐는 넣는 순서대로 이 순서가 바뀌지 않는다. 넣을 때 방문 처리를 한다. pq는 이미 순서대로 처리해서 넣을 때 마다 정리.

pq 쓸떄는 넣을떄마다 방문처리 안한다. pq 쓸때만 그럼!(넣을떄마다 알아서 위치가 바뀌기 때문) 그래서 pq에선 방문처리 안한다 그래서 끄집어내서 방문처리를 한다.

ctrl shift o 는 자동 정렬

package a0419.add;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Solution_d4_3124_최소스패닝트리_MST3_PrimPQListTest {
	static class Edge implements Comparable<Edge>{
		int from,to,weight;

		public Edge(int from, int to, int weight) {
			super();
			this.from = from;
			this.to = to;
			this.weight = weight;
		}
		@Override
		public int compareTo(Edge o) {
			return Integer.compare(this.weight, o.weight);
		}
	}
	public static void main(String args[]) throws Exception{
		System.setIn(new FileInputStream("res/input_d4_3124.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb=new StringBuilder();
		int T=Integer.parseInt(br.readLine());

		for(int tc=1; tc<=T; tc++){
			StringTokenizer st = new StringTokenizer(br.readLine()," ");	 
			int V = Integer.parseInt(st.nextToken());
			int E = Integer.parseInt(st.nextToken());

			//int[][] adjMatrix = new int[V][V];
			List<Edge>[] adjList=new ArrayList[V];
			for (int i = 0; i < V; i++) {
				adjList[i] = new ArrayList<Edge>();
			}
			boolean[] visited = new boolean[V];
			long[] minEdge = new long[V];				
			for (int i = 0; i < V; i++) {
				minEdge[i] = Long.MAX_VALUE;			
			}

			for (int i = 0; i < E; i++) {						
				st = new StringTokenizer(br.readLine()," ");
				int from = Integer.parseInt(st.nextToken())-1;
				int to = Integer.parseInt(st.nextToken())-1;
				int weight = Integer.parseInt(st.nextToken());
				//adjMatrix[from][to] = weight;					
				//adjMatrix[to][from] = weight;
				adjList[from].add(new Edge(from,to,weight));
				adjList[to].add(new Edge(to,from,weight));
			}

			long result = 0;
			minEdge[0] = 0;

			PriorityQueue<Vertex> queue = new PriorityQueue<Vertex>();
			queue.offer(new Vertex(0, minEdge[0]));
			int cnt = 0; // 정점 개수

			while(!queue.isEmpty()) {			
				Vertex minVertex = queue.poll();
				if(visited[minVertex.no]) continue;

				result += minVertex.cost;
				visited[minVertex.no] = true;
				if(++cnt == V) break;

				//for (int i = 0; i < V; i++) {
				//	if(!visited[i] && adjMatrix[minVertex.no][i] != 0 &&
				//			minEdge[i] > adjMatrix[minVertex.no][i]) {
				//		    minEdge[i] = adjMatrix[minVertex.no][i];
				//		    queue.offer(new Vertex(i,minEdge[i]));
				//	}
				//}
				for (Edge edge:adjList[minVertex.no]) {
					if(!visited[edge.to] && edge.weight != 0 &&
							minEdge[edge.to] > edge.weight) {
						    minEdge[edge.to] = edge.weight;
						    queue.offer(new Vertex(edge.to,minEdge[edge.to]));
					}
				}
			}
			sb.append("#").append(tc).append(" ").append(result).append("\n");
		}
		System.out.print(sb.toString());
		br.close();
	}
	static class Vertex implements Comparable<Vertex>{
		int no;
		long cost;

		public Vertex(int no, long cost) {
			this.no = no;
			this.cost = cost;
		}

		@Override
		public int compareTo(Vertex o) {
			return Long.compare(this.cost, o.cost);
		}
	}
}








© 2021.03. by yacho

Powered by github