Orig Description
Problem H: Winter Bells
The best night ever in the world has come! It's 8 p.m. of December 24th, yes, the night of Cristmas Eve. Santa Clause comes to a silent city with ringing bells. Overtaking north wind, from a sleigh a reindeer pulls she shoot presents to soxes hanged near windows for children.
The sleigh she is on departs from a big christmas tree on the fringe of the city. Miracle power that the christmas tree spread over the sky like a web and form a paths that the sleigh can go on. Since the paths with thicker miracle power is easier to go, these paths can be expressed as undirected weighted graph.
Derivering the present is very strict about time. When it begins dawning the miracle power rapidly weakens and Santa Clause can not continue derivering any more. Her pride as a Santa Clause never excuses such a thing, so she have to finish derivering before dawning.
The sleigh a reindeer pulls departs from christmas tree (which corresponds to 0th node), and go across the city to the opposite fringe (n-1 th node) along the shortest path. Santa Clause create presents from the miracle power and shoot them from the sleigh the reindeer pulls at his full power. If there are two or more shortest paths, the reindeer selects one of all shortest paths with equal probability and go along it.
By the way, in this city there are p children that wish to see Santa Clause and are looking up the starlit sky from their home. Above the i-th child's home there is a cross point of the miracle power that corresponds to c[i]-th node of the graph. The child can see Santa Clause if (and only if) Santa Clause go through the node.
Please find the probability that each child can see Santa Clause.
Input
Input consists of several datasets.
The first line of each dataset contains three integers n, m, p, which means the number of nodes and edges of the graph, and the number of the children. Each node are numbered 0 to n-1.
Following m lines contains information about edges. Each line has three integers. The first two integers means nodes on two endpoints of the edge. The third one is weight of the edge.
Next p lines represent c[i] respectively.
Input terminates when n = m = p = 0.
Output
For each dataset, output p decimal values in same order as input. Write a blank line after that.
You may output any number of digit and may contain an error less than 1.0e-6.
Constraints
3 ≤ n ≤ 100
There are no parallel edges and a edge whose end points are identical.
0 < weight of the edge < 10000
Sample Input
3 2 1
0 1 2
1 2 3
1
4 5 2
0 1 1
0 2 1
1 2 1
1 3 1
2 3 1
1
2
0 0 0
Output for the Sample Input
1.00000000
0.50000000
0.50000000
Extracted Specification
An integer n (3 ≤ n ≤ 100), representing the number of nodes.
An integer m, representing the number of edges.
An integer p, representing the number of specific points of interest.
m lines, each containing three integers. The first two integers represent nodes connected by an edge, and the third integer represents the weight of the edge (0 < weight < 10000).
p lines, each containing one integer representing a point of interest.
Input terminates when n = m = p = 0.
### Example Input:
```
3 2 1
0 1 2
1 2 3
1
4 5 2
0 1 1
0 2 1
1 2 1
1 3 1
2 3 1
1
2
0 0 0
```
### Function Signature:
Write a function f(inputs) that takes in the input.
```python
def f(inputs: List[Tuple[int, int, int, List[Tuple[int, int, int]], List[int]]]):
'''
inputs: a list of tuples, where each tuple consists of:
- an integer n
- an integer m
- an integer p
- a list of m tuples, each containing three integers
- a list of p integers
'''
```
Test Case Generator
Certainly! A test case generator for the "Winter Bells" problem can be designed to produce random graphs, as well as random children positions in the graph. Here is the Python code to generate such test cases:
```python
import random
def generate_graph(n, m):
edges = []
possible_edges = [(i, j) for i in range(n) for j in range(i + 1, n)]
random.shuffle(possible_edges)
for _ in range(m):
u, v = possible_edges.pop()
weight = random.randint(1, 9999)
edges.append((u, v, weight))
return edges
def tcgen():
test_cases = []
while True:
n = random.randint(3, 100)
m = random.randint(n-1, n*(n-1)//2)
p = random.randint(1, n)
edges = generate_graph(n, m)
children = [random.randint(0, n-1) for _ in range(p)]
test_cases.append((n, m, p, edges, children))
# Break condition for the loop
if random.random() < 0.1: # 10% chance to stop adding more test cases
break
return test_cases
def format_test_cases(test_cases):
formatted = []
for n, m, p, edges, children in test_cases:
formatted.append(f"{n} {m} {p}")
formatted.extend(f"{u} {v} {w}" for u, v, w in edges)
formatted.extend(f"{c}" for c in children)
formatted.append("") # Blank line after each dataset
formatted.append("0 0 0") # Termination line
return "\n".join(formatted)
# Generate and format the test cases
test_cases = tcgen()
formatted_test_cases = format_test_cases(test_cases)
print(formatted_test_cases)
```
### Explanation:
1. **Graph Generation (`generate_graph`)**:
- Generates a list of possible edges for a graph with `n` nodes.
- Randomly selects `m` edges from the list of possible edges.
- Assigns a random weight to each selected edge.
2. **Test Case Generation (`tcgen`)**:
- Generates multiple test cases until a random break condition is met.
- Each test case consists of:
- Random number of nodes (`n`), edges (`m`), and children (`p`).
- A randomly generated graph with `n` nodes and `m` edges.
- Randomly selected positions for `p` children.
3. **Formatting Test Cases (`format_test_cases`)**:
- Converts the test cases into the desired string format.
- Adds a blank line after each dataset.
- Adds the termination line `0 0 0`.
This generator will create well-formed, random test cases to thoroughly test your solution for the "Winter Bells" problem. You can run the code to print the generated test cases.
Extract Arguments
def extract_arguments(fh):
datasets = []
while True:
n, m, p = map(int, fh.readline().strip().split())
if n == 0 and m == 0 and p == 0:
break
edges = [tuple(map(int, fh.readline().strip().split())) for _ in range(m)]
children = [int(fh.readline().strip()) for _ in range(p)]
datasets.append((n, m, p, edges, children))
return datasets