이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
import java.io.*;
import java.util.*;
class commuter_pass {
public static void main(String[] args) throws IOException {
commuter_pass obj = new commuter_pass();
obj.doStuff();
}
void gen() throws IOException {
PrintWriter out = new PrintWriter(new File("filename.in"));
out.println("50000 99996");
out.println("1 50000");
out.println("2 3");
for (int i = 2; i <= 49999; i++) {
out.println("1 "+i+" 1");
}
for (int i = 2; i <= 49999; i++) {
out.println("50000 "+i+" 1");
}
out.close();
}
class SortArr implements Comparator<long[]> {
@Override
public int compare(long[] o1, long[] o2) {
return (o1[1]<o2[1])?-1:((o1[1]>o2[1])?1:0);
}
}
ArrayList<Integer>[] vals;
@SuppressWarnings("unchecked")
void dijk1() {
PriorityQueue<long[]> pq = new PriorityQueue<>(new SortArr());
pq.add(new long[] {s, 0});
long[] mins = new long[graph.length];
Arrays.fill(mins, Long.MAX_VALUE);
vals = new ArrayList[graph.length];
boolean[] vis = new boolean[graph.length];
for (int i = 0; i < vals.length; i++) {
vals[i] = new ArrayList<>();
}
while (!pq.isEmpty()) {
long[] next = pq.poll();
int pos = (int) next[0];
if (vis[pos]) continue;
vis[pos] = true;
for (int[] i : graph[pos]) {
long nc = mins[pos]+i[1];
if (nc < mins[i[0]]) {
mins[i[0]] = nc;
vals[i[0]] = new ArrayList<>();
vals[i[0]].add(pos);
pq.add(new long[] {i[0], nc});
} else if (nc == mins[i[0]]) {
vals[i[0]].add(pos);
pq.add(new long[] {i[0], nc});
}
}
}
}
long[] minu, minv;
long recur(int val, int par) {
minv[val] = Math.min(minv[val], varr[val]);
if (val == s) {
minu[s] = uarr[s];
return minu[s];
} else {
long thisu = uarr[val];
for (int i : vals[val]) {
if (i == par) continue;
minv[i] = minv[val];
thisu = Math.min(thisu, recur(i, val));
}
minu[val] = thisu;
return thisu;
}
}
long[] dijk2(int n) {
PriorityQueue<long[]> pq = new PriorityQueue<>(new SortArr());
pq.add(new long[] {n, 0});
long[] mins = new long[graph.length];
Arrays.fill(mins, Long.MAX_VALUE);
boolean[] vis = new boolean[graph.length];
mins[n] = 0;
while (!pq.isEmpty()) {
long[] next = pq.poll();
int pos = (int) next[0];
if (vis[pos]) continue;
vis[pos] = true;
for (int[] i : graph[pos]) {
long nc = mins[pos]+i[1];
if (nc < mins[i[0]]) {
mins[i[0]] = nc;
pq.add(new long[] {i[0], nc});
}
}
}
return mins;
}
int n, m, s, t, u, v;
ArrayList<int[]>[] graph;
long ans = Long.MAX_VALUE;
long[] uarr, varr;
@SuppressWarnings("unchecked")
private void doStuff() throws IOException {
gen();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
s = Integer.parseInt(st.nextToken())-1;
t = Integer.parseInt(st.nextToken())-1;
st = new StringTokenizer(br.readLine());
u = Integer.parseInt(st.nextToken())-1;
v = Integer.parseInt(st.nextToken())-1;
graph = new ArrayList[n];
for (int i = 0; i < graph.length; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken())-1;
int b = Integer.parseInt(st.nextToken())-1;
int v = Integer.parseInt(st.nextToken());
graph[a].add(new int[] {b, v});
graph[b].add(new int[] {a, v});
}
br.close();
dijk1();
uarr = dijk2(u);
varr = dijk2(v);
minu = new long[graph.length];
minv = new long[graph.length];
Arrays.fill(minu, Long.MAX_VALUE);
Arrays.fill(minv, Long.MAX_VALUE);
recur(t, -1);
long ans = uarr[v];
for (int i = 0; i < graph.length; i++) {
if (minu[i] != Long.MAX_VALUE &&
minv[i] != Long.MAX_VALUE) {
ans = Math.min(ans, minu[i]+minv[i]);
}
}
System.out.println(ans);
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |