코딩

알고스팟 자바(java) 해답 : FIRETRUCKS

King Attila 2021. 5. 14. 07:47
728x90
import java.util.*;

public class Main{
	
	static int c, v, e, n, m;
	
	static int[][] edge;
	
	static int[][] dist;
	
	static int[] num;
	
	static int[] location;
	
	static int[] fire;
	
	static int[] value;
	
	static int[] value2;
	
	public static void main(String args[]) throws Exception {
		
		edge = new int[1002][1002];
		
		dist = new int[1002][1002];
		
		num = new int[1002];
		
		value = new int[1002];
		
		value2 = new int[1002];
		
		location = new int[1002];
		
		fire = new int[1002];
		
		int test = 0;
		
		Scanner scanner = new Scanner(System.in);
        
		test = scanner.nextInt();
		
		for(int i = 0; i < test; i++){
			int sum = 0;
			v = scanner.nextInt();
			e = scanner.nextInt();
			n = scanner.nextInt();
			m = scanner.nextInt();
			Arrays.fill(num, 1);
			Arrays.fill(value, 0x7fffffff);
		
			for(int j = 1; j <= e; j++){
				int a, b, c;
				a = scanner.nextInt();
				b = scanner.nextInt();
				c = scanner.nextInt();
				edge[a][num[a]] = b;
				edge[b][num[b]] = a;
				dist[a][num[a]] = c;
				dist[b][num[b]] = c;
				num[a]++;
				num[b]++;
			}
			for(int j = 1; j <= n; j++)
				location[j] = scanner.nextInt();
			for(int j = 1; j <= m; j++)
				fire[j] = scanner.nextInt();
			for(int j = 1; j <= m; j++){
				edge[v+1][num[v+1]] = fire[j];
				edge[fire[j]][num[fire[j]]] = v+1;
				dist[v+1][num[v+1]] = 0;
				dist[fire[j]][num[fire[j]]] = 0;
				num[v+1]++;
				num[fire[j]]++;
			}
			
			sum = di(v+1,v+1);
			System.out.println(sum);
		}
    }
	
	static public int di(int from, int v){
		
		int sum = 0;
		
		int visit[];
		
		visit = new int[1002];
		
		Arrays.fill(value2, 0x7fffffff);
		
		Arrays.fill(visit, 0);
		
		value2[from] = 0;
		
		for(int i = 1; i <= v; i++){
			int now = 0;
			int nowd = 0x7fffffff;
			for(int j = 1; j <= v; j++){
				if(value2[j] < nowd && visit[j] == 0){
					now = j;
					nowd = value2[j];
				}
			}
			if(nowd == 0x7fffffff)
				break;
			visit[now] = 1;
			for(int j = 1; j < num[now]; j++){
				int a = value2[now];
				int b = dist[now][j];
				int c = edge[now][j];
				if(a + b < value2[c]){
					value2[c] = a + b;
				}
				
			}
		}
		for(int j = 1; j <= n; j++)
			sum += value2[location[j]];
		return sum;
		
	}
}
728x90