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

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

물물교환의 달인 Jack

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

요약
아이템 간 방향성 거래가 주어질 때, 최대 9번의 거래로 한 아이템에서 다른 아이템으로 바꾸는 최소 교환 비율과 그 비율을 달성하는 거래 사슬의 수를 구한다.
난이도

보통10점 중 6점

유형
그래프, DFS, 최단 경로
정답자
아직 제출이 없습니다

문제

Jack은 물물교환을 좋아한다. 이득을 볼 수만 있다면 무엇이든 다른 것과 바꾼다. 지금 Jack은 어떤 물건을 얻으려 하고, 그 대가로 다른 물건을 내놓을 생각이다. 필요하다면 친구들과 여러 번 교환하는 사슬(연쇄 거래)을 거쳐도 된다.

각 친구는 한 방향으로만 성립하는 거래를 제안한다. 즉, 어떤 친구가 name1 a1a_1개를 주고 name2 a2a_2개를 받는 거래를 제안하더라도, 그 반대 방향의 거래(즉 name2를 주고 name1을 받는 거래)까지 해 준다는 뜻은 아니다.

일이 너무 복잡해지지 않도록, Jack은 하나의 연쇄 거래에 자기 이외의 사람을 최대 99명까지만 끼워 넣는다. 즉, 한 사슬은 최대 99번의 거래로 이루어진다.

한 사슬의 교환 비율이란, Jack이 원하는 물건 11개를 얻기 위해 내놓아야 하는, 그가 내줄 물건의 개수를 뜻한다. Jack이 내줄 물건을 그가 원하는 물건으로 바꾸는 모든 사슬 중에서 가장 좋은(가장 작은) 교환 비율을 구하고, 정확히 그 비율을 달성하는 서로 다른 사슬이 몇 개인지 구하여라.

입력

첫째 줄에 테스트 케이스의 수 nn이 주어진다.

각 테스트 케이스의 첫째 줄에는 두 물건의 이름과 양의 정수 mm(m≤50m \le 50)이 주어진다. 첫 번째 이름은 Jack이 원하는 물건, 두 번째 이름은 Jack이 내줄 물건이며, mm은 가능한 거래의 수이다. 이어지는 mm개의 줄은 각각 다음과 같은 형식이다.

a1 name1 a2 name2

이는 어떤 친구가 물건 name1 a1a_1개를 주고 물건 name2 a2a_2개를 받을 의향이 있다는 뜻이다(친구가 name1을 주고 name2를 받는다. 단, 이 거래가 있다고 해서 반대 방향 거래까지 가능하다는 뜻은 아니다). 각 a1a_1과 a2a_2는 2020 이하의 양의 정수이다. 어떤 거래도 성사시키는 데 231−12^{31}-1개보다 많은 물건이 필요하지는 않다.

출력

각 테스트 케이스마다 Case i:(여기서 ii는 11부터 시작하는 테스트 케이스 번호)를 출력하고, 이어서 공백 하나, Jack이 얻을 수 있는 가장 좋은(가장 작은) 교환 비율, 다시 공백 하나, 그리고 그 비율을 얻을 수 있는 서로 다른 방법의 수를 출력한다.

교환 비율은 지수 표기가 아니라 일반적인 십진 소수(고정소수점) 표기로 나타내며, 유효숫자 55자리가 되도록 반올림하고 끝자리의 00도 그대로 표시한다. 예를 들어 1.8000, 0.28571과 같이 출력한다. 값이 두 유효숫자 55자리 결과의 정확히 중간에 놓이는 경우에는 올림한다.

예제2

  1. 예제 1

    입력
    2
    goldfish marbles 3
    1 goldfish 2 marbles
    5 shovels 3 marbles
    1 goldfish 3 shovels
    this that 4
    7 this 2 that
    14 this 4 that
    7 this 2 theother
    1 theother 1 that
    
    예상 출력
    Case 1: 1.8000 1
    Case 2: 0.28571 3
    
  2. 예제 2

    입력
    1
    gold silver 1
    1 gold 1 silver
    
    예상 출력
    Case 1: 1.0000 1