아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

어려운 모든 정점 쌍 최단 거리

시간 제한1초메모리 제한1024 MB

요약
가중치 1인 간선이 정확히 하나이고 나머지는 0인 연결 그래프에서 모든 정점 쌍의 최단 거리 합을 구한다.
난이도

어려움10점 중 8점

유형
그래프, 유니온 파인드, 동적 계획법, 조합론
정답자
아직 제출이 없습니다

문제

연두는 방금 "플로이드 와샬 알고리즘"을 공부했다. 이 알고리즘은 NN개의 정점으로 이루어진 그래프에서 모든 정점 쌍의 최단 거리를 O(N3)O(N^3)에 구해준다.

신이 난 연두는 자신이 좋아하는 그래프를 하나 가져왔다. 이 그래프는 NN개의 정점과 MM개의 양방향 간선으로 이루어진 단순 연결 그래프이며, 정점에는 1,2,…,n1, 2, \dots, n으로 번호가 매겨져 있다. 또한 딱 하나의 간선에만 11의 가중치가 있고 나머지 간선은 가중치가 00이다.

이제 이 그래프에서 모든 정점 쌍의 최단 거리의 합을 구해보려고 한다. 즉, 1≤i<j≤N1 \le i < j \le N를 만족하는 모든 N(N−1)2\frac{N(N-1)}{2}개의 쌍 (i,j)(i,j)에 대해, ii번 정점과 jj번 정점 간의 최단 거리를 전부 더한 값을 구할 것이다.

연두는 신나서 코드를 짰지만 한참 동안 기다려도 결과가 나오지 않았다. 절망에 빠진 연두는 더 좋은 방법을 생각해 냈는데, 바로 대회에 이 문제를 출제하여 여러분들이 답을 대신 구하게 하는 것이다.

입력

첫 번째 줄에 정점의 개수 NN(2≤N≤100 0002 \le N \le 100\,000), 간선의 개수 MM(1≤M≤200 0001 \le M \le 200\,000), 정수 KK(1≤K≤M1 \le K \le M)가 주어진다.

다음 MM개의 줄에 걸쳐 uiu_i와 viv_i가 주어진다. 이것은 ii번째 간선이 uiu_i와 viv_i를 잇는다는 것을 의미한다. (1≤ui,vi≤n,ui≠vi1 \le u_i, v_i \le n, u_i \ne v_i)

단순 연결 그래프만 입력으로 주어지며, KK번째 간선의 가중치는 11이고, 나머지 간선의 가중치는 00이다.

출력

모든 정점 쌍의 최단 거리의 합을 출력한다.

출력의 값이 32비트형 정수(C/C++의 int)의 최댓값을 넘을 수 있음에 주의하자.

힌트

단순 연결 그래프란 다음 조건들을 모두 만족하는 그래프를 의미한다.

  • 어떤 정점 uu와 다른 정점 vv를 잇는 간선 u−vu-v는 최대 한 개이다.
  • 어떤 정점 uu를 스스로 연결하는 간선 u−uu-u는 존재하지 않는다.
  • 어떤 정점 uu에서 다른 정점 vv까지 한 개 이상의 간선을 이용하여 항상 도달할 수 있다.

예제2

  1. 예제 1

    입력
    5 4 2
    1 2
    2 3
    3 4
    4 5
    
    예상 출력
    6
    
  2. 예제 2

    입력
    3 3 1
    1 2
    2 3
    3 1
    
    예상 출력
    0