317号子任务(Java超时)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {

	static Scanner sc = new Scanner(System.in);

	static class Edge {
		int t, w;

		public int getT() {
			return t;
		}

		public void setT(int t) {
			this.t = t;
		}

		public int getW() {
			return w;
		}

		public void setW(int w) {
			this.w = w;
		}

		public Edge(int t, int w) {
			super();
			this.t = t;
			this.w = w;
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + t;
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Edge other = (Edge) obj;
			if (t != other.t)
				return false;
			return true;
		}

	}

	static ArrayList<ArrayList<Edge>> edges = new ArrayList<>();

	static ArrayList<Integer> safe = new ArrayList<Integer>();
	static ArrayList<ArrayList<Integer>> safeMinDistance = new ArrayList<>();
	static int n, m, k;

	public static void main(String[] args) {
		n = sc.nextInt();
		m = sc.nextInt();
		k = sc.nextInt();
		mine = new Integer[n + 1];
		vis = new boolean[n + 1];
		edges.add(new ArrayList<Edge>());
		for (int i = 0; i < n; i++) {
			ArrayList<Edge> e = new ArrayList<Edge>();
			e.add(new Edge(i + 1, 0));
			edges.add(e);
			int type = sc.nextInt();
			if (type == 1) {
				safe.add(i + 1);
			}
		}
		for (int i = 0; i < m; i++) {
			int u = sc.nextInt();
			int v = sc.nextInt();
			int w = sc.nextInt();
			Edge e = new Edge(v, w);
			int idx = edges.get(u).indexOf(e);
			if (idx != -1) {
				if (edges.get(u).get(idx).getW() > w) {
					edges.get(u).get(idx).setW(w);
				}
			} else {
				edges.get(u).add(e);
			}
			e = new Edge(u, w);
			idx = edges.get(v).indexOf(e);
			if (idx != -1) {
				if (edges.get(v).get(idx).getW() > w) {
					edges.get(v).get(idx).setW(w);
				}
			} else {
				edges.get(v).add(e);
			}
		}

		for (int i : safe) {
			dij(i);
		}
//		for (ArrayList<Integer> lst : safeMinDistance) {
//			lst.forEach(x -> System.out.print(x + " "));
//			System.out.println();
//		}
		for (int i = 1; i <= n; i++) {
			PriorityQueue<Integer> que = new PriorityQueue<Integer>((Integer o1, Integer o2) -> o2 - o1);
			for (ArrayList<Integer> lst : safeMinDistance) {
				if (lst.get(i) != Integer.MAX_VALUE) {
					que.add(lst.get(i));
					if (que.size() > k) {
						que.remove();
					}
				}
			}
			int sum = 0;
			for (Integer t : que) {
//				System.out.print(t + " ");
				sum += t;
			}
//			System.out.println();
			System.out.println(sum);
		}
	}

	static boolean[] vis;
	static Integer[] mine;

	static void dij(int p) {
		Arrays.fill(mine, Integer.MAX_VALUE);
		Arrays.fill(vis, false);
		mine[p] = 0;
		vis[p] = true;
		ArrayList<Edge> es = edges.get(p);

		int u = -1, min = Integer.MAX_VALUE;
		for (Edge e : es) {
			mine[e.t] = e.w;
		}
		for (int i = p + 1; i != p; i++) {
			if (i == n + 1)
				i = 1;
			u = -1;
			min = Integer.MAX_VALUE;
			for (int j = 1; j <= n; j++) {
				if (!vis[j] && mine[j] < min) {
					min = mine[j];
					u = j;
				}
			}
			if (u == -1)
				break;
			vis[u] = true;
			ArrayList<Edge> us = edges.get(u);
			for (Edge e : us) {
				if (!vis[e.t] && mine[e.t] > mine[u] + e.w) {
					mine[e.t] = mine[u] + e.w;
				}
			}
		}
		ArrayList<Integer> lst = new ArrayList<Integer>();
		lst.addAll(Arrays.asList(mine));
		safeMinDistance.add(lst);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值