Submission #1636057


Source Code Expand

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.NoSuchElementException;
import java.util.Queue;

class Edge {
	int to;
	long weight;

	Edge(int to, long weight) {
		this.to = to;
		this.weight = weight;
	}
}

class Graph {
	int n;
	boolean directed;
	ArrayList<Node> ns;

	Graph(int n, boolean directed) {
		this.n = n;
		this.directed = directed;
		ns = new ArrayList<Node>();
		for (int i = 0; i < n; i++) {
			ns.add(new Node(i));
		}
	}

	void edge(int from, int to, long weight) {
		ns.get(from).edge(to, weight);
		if (!directed) {
			ns.get(to).edge(from, weight);
		}
	}

	void dfs(int from) {
		for (Node n : ns) {
			n.tmp = 0;
		}
		dfsImpl(from);
	}

	void dfsVisit(Node n) {
		// write code here...
	}

	private void dfsImpl(int from) {
		Node n = ns.get(from);
		if (n.tmp != 0)
			return;
		n.tmp = 1;
		dfsVisit(n);
		for (Edge e : n.es) {
			dfsImpl(e.to);
		}
	}

	void dijkstra1(int from) {
		for (int i = 0; i < n; i++) {
			ns.get(i).dist = Long.MAX_VALUE;
		}

		Queue<Node> q = new ArrayDeque<Node>();

		Node st = ns.get(from);
		st.dist = 0;
		q.add(st);

		while (!q.isEmpty()) {
			Node n = q.poll();
			long dist = n.dist;
			for (Edge e : n.es) {
				Node to = ns.get(e.to);
				if (to.dist > dist + 1) {
					to.dist = dist + 1;
					q.add(to);
				}
			}
		}
	}

	long diameter1() {
		dijkstra1(0);
		Node n1 = ns.get(0);

		for (int i = 1; i < n; i++) {
			if (ns.get(i).dist > n1.dist)
				n1 = ns.get(i);
		}

		dijkstra1(n1.idx);

		long diam = 0;
		for (int i = 0; i < n; i++) {
			if (ns.get(i).dist > diam)
				diam = ns.get(i).dist;
		}

		return diam;
	}
}

class Node {
	int idx;
	int tmp;
	ArrayList<Edge> es;

	long dist;

	Node(int idx) {
		this.idx = idx;
		es = new ArrayList<Edge>();
	}

	void edge(int to, long weight) {
		es.add(new Edge(to, weight));
	}
}

public class Main {
	private static void solve() {
		int n1 = nei();
		int m1 = nei();
		int[][] es1 = nis2(m1, 2);
		Graph g1 = new Graph(n1, false);
		for (int i = 0; i < m1; i++) {
			g1.edge(es1[i][0], es1[i][1], 1);
		}

		int n2 = nei();
		int m2 = nei();
		int[][] es2 = nis2(m2, 2);
		Graph g2 = new Graph(n2, false);
		for (int i = 0; i < m2; i++) {
			g2.edge(es2[i][0], es2[i][1], 1);
		}

		long d1 = g1.diameter1();
		long d2 = g2.diameter1();

		long k1 = d1;
		long k2 = d2;

		for (int i = 0; i < g1.n; i++) {
			g1.dijkstra1(i);
			long max = 0;
			for (int j = 0; j < g1.n; j++) {
				if (g1.ns.get(j).dist > max) {
					max = g1.ns.get(j).dist;
				}
			}
			if (max > d1)
				throw new Error("!?");
			if (max < k1)
				k1 = max;
		}

		for (int i = 0; i < g2.n; i++) {
			g2.dijkstra1(i);
			long max = 0;
			for (int j = 0; j < g2.n; j++) {
				if (g2.ns.get(j).dist > max) {
					max = g2.ns.get(j).dist;
				}
			}
			if (max > d2)
				throw new Error("!?");
			if (max < k2)
				k2 = max;
		}

		out(max(max(d1, d2), (k1 + 1 + k2)) + " " + (d1 + d2 + 1));
	}

	static int[] lis(int[] s) {
		int n = s.length;
		int[] dp = new int[n];
		int[] ids = new int[n];
		int[] pids = new int[n];
		dp[0] = s[0];
		int len = 1;
		int lidx = 0;
		for (int i = 1; i < n; i++) {
			int idx = bs(s[i], dp, 0, len);
			dp[idx] = s[i];
			ids[idx] = i;
			if (idx == len) {
				lidx = i;
				len++;
			}
			if (idx > 0)
				pids[i] = ids[idx - 1];
		}
		int[] lis = new int[len];
		lis[len - 1] = s[lidx];
		for (int i = len - 1; i >= 0; i--) {
			lis[i] = s[lidx];
			lidx = pids[lidx];
		}
		return lis;
	}

	static int bs(int a, int[] as, int from, int num) {
		int min = from;
		int max = from + num - 1;
		while (min < max) {
			int mid = min + max >> 1;
			if (as[mid] < a)
				min = mid + 1;
			else if (as[mid] > a)
				max = mid;
			else
				return mid;
		}
		return as[min] < a ? min + 1 : min;
	}

	static int gcd(int x, int y) {
		x = (x ^ x >> 31) - (x >> 31);
		y = (y ^ y >> 31) - (y >> 31);
		if (x < y) {
			x ^= y;
			y ^= x;
			x ^= y;
		}
		int z = x % y;
		if (z == 0)
			return y;
		return gcd(y, z);
	}

	static long gcd(long x, long y) {
		x = (x ^ x >> 63) - (x >> 63);
		y = (y ^ y >> 63) - (y >> 63);
		if (x < y) {
			x ^= y;
			y ^= x;
			x ^= y;
		}
		long z = x % y;
		if (z == 0)
			return y;
		return gcd(y, z);
	}

	static int lcm(int x, int y) {
		x = (x ^ x >> 31) - (x >> 31);
		y = (y ^ y >> 31) - (y >> 31);
		return x / gcd(x, y) * y;
	}

	static long lcm(long x, long y) {
		x = (x ^ x >> 63) - (x >> 63);
		y = (y ^ y >> 63) - (y >> 63);
		return x / gcd(x, y) * y;
	}

	static int abs(int x) {
		return x < 0 ? -x : x;
	}

	static long abs(long x) {
		return x < 0 ? -x : x;
	}

	static int min(int a, int b) {
		return a < b ? a : b;
	}

	static long min(long a, long b) {
		return a < b ? a : b;
	}

	static int max(int a, int b) {
		return a > b ? a : b;
	}

	static long max(long a, long b) {
		return a > b ? a : b;
	}

	static int clamp(int a, int min, int max) {
		return a < min ? min : a > max ? max : a;
	}

	static long clamp(long a, long min, long max) {
		return a < min ? min : a > max ? max : a;
	}

	static void out(String val) {
		IO.out(val);
	}

	static void out(Object val) {
		IO.out(String.valueOf(val));
	}

	static void out(int val) {
		IO.out(String.valueOf(val));
	}

	static void out(long val) {
		IO.out(String.valueOf(val));
	}

	static void out(char val) {
		IO.out(String.valueOf(val));
	}

	static void out(float val) {
		IO.out(String.valueOf(val));
	}

	static void out(double val) {
		IO.out(String.valueOf(val));
	}

	static void out(boolean val) {
		IO.out(String.valueOf(val));
	}

	static void kil(String val) {
		IO.out(val);
		IO.flush();
		System.exit(0);
	}

	static void kil(Object val) {
		IO.out(String.valueOf(val));
		IO.flush();
		System.exit(0);
	}

	static void kil(int val) {
		IO.out(String.valueOf(val));
		IO.flush();
		System.exit(0);
	}

	static void kil(long val) {
		IO.out(String.valueOf(val));
		IO.flush();
		System.exit(0);
	}

	static void kil(char val) {
		IO.out(String.valueOf(val));
		IO.flush();
		System.exit(0);
	}

	static void kil(float val) {
		IO.out(String.valueOf(val));
		IO.flush();
		System.exit(0);
	}

	static void kil(double val) {
		IO.out(String.valueOf(val));
		IO.flush();
		System.exit(0);
	}

	static void kil(boolean val) {
		IO.out(String.valueOf(val));
		IO.flush();
		System.exit(0);
	}

	static String nes() {
		return IO.next();
	}

	static int nei() {
		return IO.nextInt();
	}

	static long nel() {
		return IO.nextLong();
	}

	static String[] nss(int n) {
		String[] as = new String[n];
		for (int i = 0; i < n; i++) {
			as[i] = IO.next();
		}
		return as;
	}

	static int[] nis(int n) {
		int[] as = new int[n];
		for (int i = 0; i < n; i++) {
			as[i] = IO.nextInt();
		}
		return as;
	}

	static long[] nls(int n) {
		long[] as = new long[n];
		for (int i = 0; i < n; i++) {
			as[i] = IO.nextLong();
		}
		return as;
	}

	static String[][] nss2(int n, int m) {
		String[][] as = new String[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				as[i][j] = IO.next();
			}
		}
		return as;
	}

	static int[][] nis2(int n, int m) {
		int[][] as = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				as[i][j] = IO.nextInt();
			}
		}
		return as;
	}

	static long[][] nls2(int n, int m) {
		long[][] as = new long[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				as[i][j] = IO.nextLong();
			}
		}
		return as;
	}

	static int parseInt(String val) {
		return Integer.parseInt(val);
	}

	static int parseInt(char val) {
		return Integer.parseInt(String.valueOf(val));
	}

	static long parseLong(String val) {
		return Long.parseLong(val);
	}

	public static void main(String[] args) {
		try {
			solve();
			IO.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

final class IO {
	private static final InputStream in = System.in;
	private static final PrintWriter out = new PrintWriter(System.out, false);
	private static final byte[] buffer = new byte[1024];
	private static int ptr = 0;
	private static int len = 0;

	private static boolean hasNextByte() {
		if (ptr < len)
			return true;
		ptr = 0;
		try {
			len = in.read(buffer);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return len > 0;
	}

	private static int readByte() {
		if (hasNextByte())
			return buffer[ptr++];
		else
			return -1;
	}

	static boolean hasNext() {
		byte c;
		while (hasNextByte() && ((c = buffer[ptr]) < '!' || c > '~'))
			ptr++;
		return hasNextByte();
	}

	static String next() {
		if (!hasNext())
			throw new NoSuchElementException();
		StringBuilder sb = new StringBuilder();
		int b = readByte();
		while (b >= '!' && b <= '~') {
			sb.append((char) b);
			b = readByte();
		}
		return sb.toString();
	}

	static long nextLong() {
		if (!hasNext())
			throw new NoSuchElementException();
		long n = 0;
		int sign = 1;
		int b = readByte();
		if (b == '-') {
			sign = -1;
			b = readByte();
		}
		if (b < '0' || '9' < b)
			throw new NumberFormatException();
		while (true) {
			if ('0' <= b && b <= '9')
				n = n * 10 + b - '0';
			else if (b == -1 || b < '!' || b > '~')
				return n * sign;
			else
				throw new NumberFormatException();
			b = readByte();
		}
	}

	static int nextInt() {
		if (!hasNext())
			throw new NoSuchElementException();
		int n = 0;
		int sign = 1;
		int b = readByte();
		if (b == '-') {
			sign = -1;
			b = readByte();
		}
		if (b < '0' || '9' < b)
			throw new NumberFormatException();
		while (true) {
			if ('0' <= b && b <= '9')
				n = n * 10 + b - '0';
			else if (b == -1 || b < '!' || b > '~')
				return n * sign;
			else
				throw new NumberFormatException();
			b = readByte();
		}
	}

	static void out(String val) {
		out.println(val);
	}

	static void flush() {
		out.flush();
	}
}

Submission Info

Submission Time
Task C - 直径
User saharan
Language Java8 (OpenJDK 1.8.0)
Score 0
Code Size 10358 Byte
Status RE
Exec Time 508 ms
Memory 37116 KB

Judge Result

Set Name Small Large
Score / Max Score 0 / 50 0 / 50
Status
AC × 26
RE × 2
AC × 55
RE × 3
Set Name Test Cases
Small 10-small_random-00, 10-small_random-01, 10-small_random-02, 10-small_random-03, 10-small_random-04, 10-small_random-05, 10-small_random-06, 10-small_random-07, 10-small_random-08, 10-small_random-09, 10-small_random-10, 10-small_random-11, 10-small_random-12, 10-small_random-13, 10-small_random-14, 10-small_random-15, 10-small_random-16, 10-small_random-17, 10-small_random-18, 10-small_random-19, 21-small_path-00, 21-small_path-01, 21-small_path-02, 21-small_path-03, 21-small_path-04, 00-sample-00, 00-sample-01, 00-sample-02
Large 00-sample-00, 00-sample-01, 00-sample-02, 10-small_random-00, 10-small_random-01, 10-small_random-02, 10-small_random-03, 10-small_random-04, 10-small_random-05, 10-small_random-06, 10-small_random-07, 10-small_random-08, 10-small_random-09, 10-small_random-10, 10-small_random-11, 10-small_random-12, 10-small_random-13, 10-small_random-14, 10-small_random-15, 10-small_random-16, 10-small_random-17, 10-small_random-18, 10-small_random-19, 20-small_tree-00, 20-small_tree-01, 20-small_tree-02, 20-small_tree-03, 20-small_tree-04, 21-small_path-00, 21-small_path-01, 21-small_path-02, 21-small_path-03, 21-small_path-04, 30-large_random-00, 30-large_random-01, 30-large_random-02, 30-large_random-03, 30-large_random-04, 30-large_random-05, 30-large_random-06, 30-large_random-07, 30-large_random-08, 30-large_random-09, 40-large_comp-00, 40-large_comp-01, 40-large_comp-02, 40-large_comp-03, 40-large_comp-04, 41-large_tree-00, 41-large_tree-01, 41-large_tree-02, 41-large_tree-03, 41-large_tree-04, 42-large_path-00, 42-large_path-01, 42-large_path-02, 42-large_path-03, 42-large_path-04
Case Name Status Exec Time Memory
00-sample-00 AC 71 ms 18900 KB
00-sample-01 AC 72 ms 21460 KB
00-sample-02 AC 71 ms 19540 KB
10-small_random-00 AC 81 ms 19540 KB
10-small_random-01 AC 79 ms 21460 KB
10-small_random-02 AC 73 ms 20308 KB
10-small_random-03 AC 75 ms 19284 KB
10-small_random-04 AC 78 ms 23380 KB
10-small_random-05 AC 80 ms 19284 KB
10-small_random-06 AC 73 ms 19412 KB
10-small_random-07 AC 75 ms 21588 KB
10-small_random-08 AC 70 ms 19412 KB
10-small_random-09 AC 74 ms 23252 KB
10-small_random-10 AC 73 ms 17236 KB
10-small_random-11 AC 74 ms 23380 KB
10-small_random-12 AC 75 ms 19540 KB
10-small_random-13 AC 72 ms 21588 KB
10-small_random-14 AC 84 ms 20820 KB
10-small_random-15 RE 78 ms 19540 KB
10-small_random-16 AC 75 ms 19540 KB
10-small_random-17 AC 91 ms 20820 KB
10-small_random-18 RE 75 ms 19028 KB
10-small_random-19 AC 78 ms 19540 KB
20-small_tree-00 AC 105 ms 20692 KB
20-small_tree-01 AC 70 ms 21460 KB
20-small_tree-02 AC 109 ms 23104 KB
20-small_tree-03 AC 72 ms 18644 KB
20-small_tree-04 AC 226 ms 31620 KB
21-small_path-00 AC 73 ms 19284 KB
21-small_path-01 AC 72 ms 19412 KB
21-small_path-02 AC 71 ms 19284 KB
21-small_path-03 AC 74 ms 21460 KB
21-small_path-04 AC 75 ms 18260 KB
30-large_random-00 AC 174 ms 24476 KB
30-large_random-01 AC 83 ms 18388 KB
30-large_random-02 AC 177 ms 21296 KB
30-large_random-03 AC 73 ms 20692 KB
30-large_random-04 AC 165 ms 25084 KB
30-large_random-05 AC 79 ms 21460 KB
30-large_random-06 AC 143 ms 26036 KB
30-large_random-07 AC 82 ms 19028 KB
30-large_random-08 RE 357 ms 35196 KB
30-large_random-09 AC 508 ms 37116 KB
40-large_comp-00 AC 73 ms 18772 KB
40-large_comp-01 AC 103 ms 22100 KB
40-large_comp-02 AC 92 ms 18260 KB
40-large_comp-03 AC 126 ms 22532 KB
40-large_comp-04 AC 153 ms 22952 KB
41-large_tree-00 AC 73 ms 21460 KB
41-large_tree-01 AC 97 ms 20308 KB
41-large_tree-02 AC 104 ms 21076 KB
41-large_tree-03 AC 148 ms 27736 KB
41-large_tree-04 AC 231 ms 33560 KB
42-large_path-00 AC 141 ms 24336 KB
42-large_path-01 AC 76 ms 20308 KB
42-large_path-02 AC 75 ms 19668 KB
42-large_path-03 AC 168 ms 29428 KB
42-large_path-04 AC 206 ms 27892 KB