CSES - Datatähti 2023 alku - Results
Submission details
Task:Sadonkorjuu
Sender:Septicuss
Submission time:2022-11-02 10:58:30 +0200
Language:Java
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
Test results
testverdicttimegroup
#1ACCEPTED0.07 s1, 2details
#2ACCEPTED0.07 s1, 2details
#3ACCEPTED0.07 s1, 2details
#4ACCEPTED0.07 s1, 2details
#5ACCEPTED0.07 s1, 2details
#60.12 s1, 2details
#70.90 s2details
#80.38 s1, 2details
#9--2details
#10ACCEPTED0.55 s1, 2details
#11--2details
#120.80 s2details
#13--2details
#14--2details
#150.11 s1, 2details
#160.33 s1, 2details
#17ACCEPTED0.52 s1, 2details
#180.18 s1, 2details
#190.51 s1, 2details
#200.36 s1, 2details
#21--2details
#22--2details
#23--2details
#240.31 s1, 2details
#25--2details
#260.41 s1, 2details
#27--2details
#280.11 s1, 2details
#290.80 s2details
#300.11 s1, 2details
#310.79 s2details

Code

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class E430 {

	static int n;
	static ArrayList<WeightedNode> ports = new ArrayList<>();

	static long[] mins;

	public static void main(String[] args) throws FileNotFoundException {

		FastReader reader = new FastReader();
		PrintWriter writer = new PrintWriter(new OutputStreamWriter(System.out));

		n = reader.nextInt();
		mins = new long[n + 1];
		ArrayList<WeightedNode> nodes = new ArrayList<>();

		int a, b, c, t;
		// City types
		for (int id = 1; id < (n + 1); id++) {
			t = reader.nextInt();
			WeightedNode node = new WeightedNode(id, t, id - 1);
			if (t == 0) {
				ports.add(node);
			}
			nodes.add(node);
		}

		WeightedGraph graph = new WeightedGraph(nodes);

		// Connections
		for (int i = 0; i < (n - 1); i++) {
			a = reader.nextInt() - 1;
			b = reader.nextInt() - 1;
			c = reader.nextInt();
			graph.addWeightedEdge(a, b, c);
		}

		reader.close();

		for (WeightedNode port : ports)
			graph.dijkstra(port);

		long sum = 0;

		for (long value : mins) {
			sum += value;
		}
		writer.println(sum);
		writer.flush();
		writer.close();
	}

	// ------------------------------------------------------

	static long lowestExpense = Long.MAX_VALUE;
	
	static class WeightedGraph {
		ArrayList<WeightedNode> nodes = new ArrayList<WeightedNode>();
		static PriorityQueue<WeightedNode> queue;

		public WeightedGraph(ArrayList<WeightedNode> nodes) {
			this.nodes = nodes;
		}

		void dijkstra(WeightedNode node) {
			if (queue == null)
				queue = new PriorityQueue<>();
			else
				queue.clear();
			node.distance = 0;

			queue.addAll(nodes);

			long expense = 0;
			
			while (!queue.isEmpty()) {
				
				if (expense > lowestExpense) {
					break;
				}
				WeightedNode current = queue.remove();
				
				for (WeightedNode neighbor : current.neighbors) {
					if (neighbor.type == 0) continue;
					
					if (queue.contains(neighbor)) {
						if (neighbor.distance > current.distance + current.weightMap.get(neighbor.id)) {
							neighbor.distance = (current.distance + current.weightMap.get(neighbor.id));

							if (mins[neighbor.id] != 0) {
								mins[neighbor.id] = Math.min(mins[neighbor.id], (long) neighbor.distance);
							} else {
								mins[neighbor.id] = (long) neighbor.distance;
							}

							neighbor.parent = current;
							expense += neighbor.distance;
							lowestExpense = Math.min(lowestExpense, expense);
							queue.remove(neighbor);
							queue.add(neighbor);
						}
					}
					
				}

			}

		}

		void addWeightedEdge(int a, int b, int c) {
			WeightedNode first = nodes.get(a);
			WeightedNode second = nodes.get(b);
			first.neighbors.add(second);
			first.weightMap.put(second.id, c);
			second.neighbors.add(first);
			second.weightMap.put(first.id, c);
		}
	}

	static class WeightedNode implements Comparable<WeightedNode> {
		int id;
		int type;
		ArrayList<WeightedNode> neighbors = new ArrayList<>();
		HashMap<Integer, Integer> weightMap = new HashMap<>();
		boolean visited = false;
		WeightedNode parent;
		long distance;
		int index;

		public WeightedNode(int id, int type, int index) {
			this.id = id;
			this.type = type;
			distance = 1001;
			this.index = index;
		}

		@Override
		public int compareTo(WeightedNode o) {
			return (int) (this.distance - o.distance);
		}

	}

	static class FastReader {

		private BufferedReader br;
		private StringTokenizer st;

		public FastReader() {
			br = new BufferedReader(new InputStreamReader(System.in));
		}

		public FastReader(InputStream in) {
			br = new BufferedReader(new InputStreamReader(in));
		}

		void close() {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			st = null;
			br = null;
		}

		String next() {
			while (st == null || !st.hasMoreElements()) {
				try {
					st = new StringTokenizer(br.readLine());
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return st.nextToken();
		}

		String nextLine() {
			String str = "";

			try {
				str = br.readLine();
			} catch (IOException e) {
				e.printStackTrace();
			}

			return str;
		}

		int nextInt() {
			return Integer.parseInt(next());
		}

		BigInteger nextBigInteger() {
			return new BigInteger(next());
		}

		double nextDouble() {
			return Double.parseDouble(next());
		}

		long nextLong() {
			return Long.parseLong(next());
		}

	}

}

Test details

Test 1

Group: 1, 2

Verdict: ACCEPTED

input
1
0

correct output
0

user output
0

Test 2

Group: 1, 2

Verdict: ACCEPTED

input
5
0 0 0 0 0
1 2 1
2 3 2
3 4 3
...

correct output
0

user output
0

Test 3

Group: 1, 2

Verdict: ACCEPTED

input
4
1 0 1 1
1 2 10
2 3 20
2 4 30

correct output
60

user output
60

Test 4

Group: 1, 2

Verdict: ACCEPTED

input
5
0 1 1 1 0
1 2 10
2 3 20
3 4 30
...

correct output
80

user output
80

Test 5

Group: 1, 2

Verdict: ACCEPTED

input
5
0 1 0 1 1
1 2 1
2 3 5
3 4 3
...

correct output
6

user output
6

Test 6

Group: 1, 2

Verdict:

input
1000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
5506363

user output
519

Test 7

Group: 2

Verdict:

input
200000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
1795118520

user output
908

Test 8

Group: 1, 2

Verdict:

input
1000
0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 ...

correct output
293576

user output
202562

Test 9

Group: 2

Verdict:

input
200000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
816932444

user output
(empty)

Test 10

Group: 1, 2

Verdict: ACCEPTED

input
1000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
3089

user output
3089

Test 11

Group: 2

Verdict:

input
200000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
40839

user output
(empty)

Test 12

Group: 2

Verdict:

input
200000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
5683983203973

user output
1319

Test 13

Group: 2

Verdict:

input
200000
0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 ...

correct output
58572993

user output
(empty)

Test 14

Group: 2

Verdict:

input
200000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
32755

user output
(empty)

Test 15

Group: 1, 2

Verdict:

input
1000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
126238345

user output
814

Test 16

Group: 1, 2

Verdict:

input
1000
0 0 0 1 0 1 1 1 0 0 1 0 1 1 0 ...

correct output
278678

user output
197546

Test 17

Group: 1, 2

Verdict: ACCEPTED

input
1000
1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ...

correct output
34929

user output
34929

Test 18

Group: 1, 2

Verdict:

input
1000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
1543963

user output
76503

Test 19

Group: 1, 2

Verdict:

input
1000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
39606

user output
37429

Test 20

Group: 1, 2

Verdict:

input
1000
1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 ...

correct output
321598

user output
191558

Test 21

Group: 2

Verdict:

input
200000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
978670626

user output
(empty)

Test 22

Group: 2

Verdict:

input
200000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
375218

user output
(empty)

Test 23

Group: 2

Verdict:

input
200000
1 1 1 1 0 0 0 0 0 1 0 1 0 1 1 ...

correct output
60422556

user output
(empty)

Test 24

Group: 1, 2

Verdict:

input
1000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
291990

user output
133843

Test 25

Group: 2

Verdict:

input
200000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
59607954

user output
(empty)

Test 26

Group: 1, 2

Verdict:

input
1000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
990

user output
991

Test 27

Group: 2

Verdict:

input
200000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
199982

user output
(empty)

Test 28

Group: 1, 2

Verdict:

input
1000
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
7987

user output
2

Test 29

Group: 2

Verdict:

input
200000
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
3137875

user output
2

Test 30

Group: 1, 2

Verdict:

input
1000
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
4657693

user output
1533

Test 31

Group: 2

Verdict:

input
200000
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
1652889357

user output
1587