제출 #526141

#제출 시각아이디문제언어결과실행 시간메모리
526141vijayRobot (JOI21_ho_t4)Java
0 / 100
3085 ms568360 KiB
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException, FileNotFoundException {
        // Scanner in = new Scanner(new File("test.in"));
        Kattio in = new Kattio();

        int N = in.nextInt();
        int M = in.nextInt();

        ArrayList<Road>[] adj = new ArrayList[N];
        HashMap<Integer, Long>[] costSum = new HashMap[N];
        HashMap<Integer, Long>[] dp2 = new HashMap[N];

        for(int i = 0; i < N; i++){
          costSum[i] = new HashMap<>();
          dp2[i] = new HashMap<>();
        }

        for(int i = 0; i < N; i++){
            adj[i] = new ArrayList<>();
        }
        for(int i = 0; i < M; i++){
            int a = in.nextInt() - 1;
            int b = in.nextInt() - 1;
            int color = in.nextInt();
            int cost = in.nextInt();
            adj[a].add(new Road(a, b, color, cost));
            adj[b].add(new Road(b, a, color, cost));

            costSum[a].put(color, costSum[a].getOrDefault(color, 0l) + cost);
            costSum[b].put(color, costSum[a].getOrDefault(color, 0l) + cost);
        }

        long[] dp = new long[N];
        Arrays.fill(dp, Integer.MAX_VALUE);
        PriorityQueue<State> pq = new PriorityQueue<>();
        dp[0] = 0;
        pq.add(new State(0, 0, 0));

        while(!pq.isEmpty()){
          State curr = pq.poll();

          if(curr.fromColor != 0){
            if(dp2[curr.pos].get(curr.fromColor) != curr.dist){
              continue;
            }

            for(Road r: adj[curr.pos]){
              if(r.color == curr.fromColor){
                long cost = costSum[r.from].get(curr.fromColor) - r.cost;
                if(cost + curr.dist < dp[r.to]){
                  dp[r.to] = curr.dist + cost;
                  pq.add(new State(r.to, 0, dp[r.to]));
                }
              }
            }
          } else {
            if(dp[curr.pos] != curr.dist){
              continue;
            }

            for(Road r: adj[curr.pos]){
              // don't flip this one
              long cost = costSum[r.from].get(r.color) - r.cost + curr.dist;
              if(cost < dp[r.to]){
                dp[r.to] = cost;
                pq.add(new State(r.to, 0, dp[r.to]));
              }

              // flip this one
              cost = curr.dist + r.cost;
              if(cost < dp[r.to]){
                dp[r.to] = cost;
                pq.add(new State(r.to, 0, dp[r.to]));
              }

              // flip j and another edge of the same color
              cost = curr.dist;
              if(!dp2[r.to].containsKey(r.color) || cost < dp2[r.to].get(r.color)){
                dp2[r.to].put(r.color, cost);
                pq.add(new State(r.to, r.color, cost));
              }
            }
          }
        }

        System.out.println(dp[N - 1] == Integer.MAX_VALUE ? -1 : dp[N - 1]);
    }

    public static class State implements Comparable<State>{
        int pos;
        int fromColor;
        long dist;
        public State(int pos, int fromColor, long dist){
            this.pos = pos;
            this.fromColor = fromColor;
            this.dist = dist;
        }

        public int compareTo(State s){
            return Long.compare(dist, s.dist);
        }
    }

    public static class Road {
        int from, to, color, cost;
        public Road(int a, int to, int color, int cost){
            this.from = a;
            this.to = to;
            this.color = color;
            this.cost = cost;
        }
    }

    static class Kattio extends PrintWriter {
		private BufferedReader r;
		private StringTokenizer st;

		// standard input
		public Kattio() { this(System.in, System.out); }
		public Kattio(InputStream i, OutputStream o) {
			super(o);
			r = new BufferedReader(new InputStreamReader(i));
		}
		// USACO-style file input
		public Kattio(String problemName) throws IOException {
			super(new FileWriter(problemName + ".out"));
			r = new BufferedReader(new FileReader(problemName + ".in"));
		}

		// returns null if no more input
		public String next() {
			try {
				while (st == null || !st.hasMoreTokens())
					st = new StringTokenizer(r.readLine());
				return st.nextToken();
			} catch (Exception e) { }
			return null;
		}

		public int nextInt() { return Integer.parseInt(next()); }
		public double nextDouble() { return Double.parseDouble(next()); }
		public long nextLong() { return Long.parseLong(next()); }
	}
}

컴파일 시 표준 에러 (stderr) 메시지

Note: Main.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...