여러 개의 클리크를 겹쳐 만든 그래프가 주어질 때, 모든 두 정점 사이 최단 경로 길이의 합을 구한다.
보통6그래프BFS최단 경로아직 제출이 없습니다시간 제한2초메모리 제한512 MB정점이 N개인 무방향 무가중치 연결 그래프 G가 있다. 정점 번호는 0번부터 N−1번까지이다.
G의 간선은 배열 V와 배열 sizes로 정해진다. V는 정점 번호를 담은 배열이고, 같은 번호가 여러 번 나올 수 있다. sizes는 V를 앞에서부터 잘라 만드는 블록의 길이를 담은 배열이다.
먼저 S[i]를 sizes의 앞 i개 원소의 합으로 정의한다. 예를 들어 sizes={10,20,30}이면 S[0]=0, S[1]=10, S[2]=30, S[3]=60이다.
0≤i<K인 모든 i에 대해 S[i]≤j<k<S[i+1]을 만족하는 쌍 (j,k)를 모두 생각한다. 각 쌍마다 정점 V[j]와 정점 V[k]를 잇는 간선이 하나 있다. 다시 말해 V[S[i]]부터 V[S[i+1]−1]까지의 정점은 완전 그래프를 이룬다. 이렇게 만들어진 간선 말고 다른 간선은 없다.
N, V, sizes가 주어지면 서로 다른 두 정점의 모든 쌍에 대해 최단 경로의 길이를 구하고 그 합을 출력하는 프로그램을 작성하시오. 입력으로 주어지는 그래프는 항상 연결 그래프이다.
첫째 줄에 정점의 수 N (2≤N≤2500), V의 크기 M (1≤M≤5000), sizes의 크기 K (1≤K≤2500)가 공백으로 구분되어 주어진다.
둘째 줄에 V의 원소 M개가 순서대로 주어진다. 셋째 줄에 sizes의 원소 K개가 순서대로 주어진다.
V의 원소는 모두 0 이상 N−1 이하이다. sizes의 원소는 모두 2 이상 N 이하인 자연수이고, 그 합은 M 이하이다. 0≤i<K인 모든 i에 대해 V[S[i]],V[S[i]+1],…,V[S[i+1]−1]은 서로 다르다.
서로 다른 두 정점으로 이루어진 모든 쌍의 최단 경로 길이를 더한 값을 첫째 줄에 출력한다. 한 쌍은 한 번만 센다. 이 값은 32비트 정수의 범위를 넘을 수 있다.