Trên thực tế có nhiều bài toán liên quan tới một tập các đối tượng và những mối
liên hệ giữa chúng, đòi hỏi toán học phải đặt ra một mô hình biểu diễn một cách chặt
chẽ và tổng quát bằng ngôn ngữ ký hiệu, đó là đồ thị. Những ý tưởng cơ bản của nó
được đưa ra từ thế kỷ thứ XVIII bởi nhà toán học Thuỵ Sĩ Leonhard Euler, ông đã
dùng mô hình đồ thị để giải bài toán về những cây cầu Konigsberg nổi tiếng.
Mặc dù Lý thuyết đồ thị đã được khoa học phát triển từ rất lâu nhưng lại có
nhiều ứng dụng hiện đại. Đặc biệt trong khoảng vài mươi năm trở lại đây, cùng với sự
ra đời của máy tính điện tử và sự phát triển nhanh chóng của Tin học, Lý thuyết đồ thị
càng được quan tâm đến nhiều hơn. Đặc biệt là các thuật toán trên đồ thị đã có nhiều
ứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy tính, Lý thuyết mã, Tối ưu
hoá, Kinh tế học v.v Chẳng hạn như trả lời câu hỏi: Hai máy tính trong mạng có thể
liên hệ được với nhau hay không?; hay vấn đề phân biệt hai hợp chất hoá học có cùng
công thức phân tử nhưng lại khác nhau về công thức cấu tạo cũng được giải quyết nhờ
mô hình đồ thị. Hiện nay, môn học này là một trong những kiến thức cơ sở của bộ môn
khoa học máy tính.
Lý thuyết đồ thị là một phần quan trọng trong nội dung chương trình chuyên của
môn Tin học tại các trường chuyên. Hầu như trong các đề thi học sinh giỏi đều có các
bài toán liên quan đến lý thuyết đồ thị, do đó để học sinh có được kết quả cao chúng ta
cần trang bị cho các em một nền tảng tốt cũng như các kỹ thuật cài đặt các bài toán cơ
bản của lý thuyết đồ thị.
Tuy nhiên, lý thuyết đồ thị là một môn học cần tốn nhiều thời gian để truyền đạt,
có một số vấn đề thì cần thiết cho học sinh trong các kỳ thi, một số khác không cần
thiết, đặc biệt là một số vấn đề cần chứng mình, các định lý. Mặt khác một số vấn đề
lại phải được trang bị sâu nhằm giúp học sinh giải quyết tốt vấn đề trong các đề thi lại
không có trong nhiều tài liệu lý thuyết đồ thị cổ điển. Những vấn đề đó thường liên
quan đến ứng dụng của lý thuyết đồ thị để giải quyết các bài toán thực tế.Một vấn đề
khó khăn mà giáo viên gặp phải là quỹ thời gian của chúng ta rất ít mà nội dung giảng
dạy nhiều. Do đó vấn đề chọn lựa những chuyên đề nào dạy và dạy đến đâu, những
vấn đề nào định hướng cho học sinh tự học cần phải đặt ra cho Giáo viên giảng dạy các
lớp chuyên Tin học và các đội tuyển chuẩn bị cho các kỳ thi Học sinh giỏi.
Trong phạm vi một chuyên đề, không thể nói kỹ và nói hết những vấn đề của lý
thuyết đồ thị mà chỉ giới thiệu các bài toán cơ bản của Lý thuyết đồ thị trong Tin học
cùng với phương pháp truyền đạt cho học sinh. Tập bài giảng này sẽ xem xét lý thuyết
đồ thị dưới góc độ người lập trình, tức là khảo sát những thuật toán cơ bản nhất có thể
dễ dàng cài đặt trên máy tính một số ứng dụng của nó. Các khái niệm trừu tượng và
các phép chứng minh sẽ được diễn giải một cách hình thức cho đơn giản và dễ hiểu
chứ không phải là những chứng minh chặt chẽ dành cho người làm toán. Ngoài ra cũng
cung cấp một số bài tập trên mạng đã được phân loại thành các dạng giúp giáo viên có
nguồn bài tập cung cấp cho học sinh sau khi giảng dạy các chuyên đề. Lời giải của các
bài tập được cung cấp dưới dạng chương trình.
Nội dung chuyên đề lý thuyết đồ thị
Mục đích
Trang bị cho học sinh các kiến thức cơ bản cần thiết về đồ thị để giải quyết các bài
toán thi học sinh giỏi.
1. Các khái niệm cơ bản
2. Các phương pháp tìm kiếm trên đồ thị
3. Chu trình Ơle và Hammilton
4. Cây Khung
5. Đường đi Ngắn nhất
6. Luồng trên mạng
7. Bài tập theo chủ đề
8. Các bài toán đồ thị trong các kỳ thi Quốc gia
9. Chương trình giải
Nội dung các bài giảng từ phần 1 tới phần 6 được soạn trên slide trong file đính kèm
7. Bài tập theo chủ đề
Chuyên đề Tìm kiếm theo chiều rộng (BFS)
1. Lucky Numbers
Mã bài: LUCKYNUM
Trong một số nước châu Á, 8 và 6 được coi là những chữ số may mắn. Bất cứ số nguyên
nào chỉ chứa chữ số 8 và 6 được coi là số may mắn, ví dụ 6, 8, 66, 668, 88, 886 ….
Nguyên là một học sinh rất thích toán. Nguyên thích các số may mắn nhưng chỉ thích các
số có dạng
S = 8…86…6
trong đó S có ít nhất một chữ số và chữ số 6 và 8 không nhất thiết phải đồng thời xuất
hiện. Ví dụ, 8, 88, 6, 66, 86, 886, 8866 … là các số có dạng S.
Cho trước một số nguyên dương X (1 < X < 10 000), Nguyên muốn tìm số may mắn nhỏ
nhất dạng S, có không quá 200 chữ số và chia hết cho X.
Nhiệm vụ của bạn là viết một chương trình tìm số đó cho Nguyên.
Dữ liệu vào
Dữ liệu vào gồm nhiều bộ dữ liệu tương ứng với nhiều test. Dòng đầu tiên chứa một số
nguyên dương không lớn hơn 20 là số lượng các bộ dữ liệu. Các dòng tiếp theo chứa các
bộ dữ liệu.
Trên mỗi dòng tiếp theo chứa một số nguyên X tương ứng với mỗi bộ dữ liệu.
Dữ liệu ra
Với mỗi bộ dữ liệu, ghi ra trên một dòng số may mắn dạng S nhỏ nhất chia hết cho X.
Trường hợp không tồn tại số S có không quá 200 chữ số như vậy, ghi -1.
Ví dụ
LUCKYNUM.INP LUCKYNUM.OUT
4
6
8
43
5
6
8
86
-1
2. VOI06 Quân tượng
Mã bài: QBBISHOP
Xét bàn cờ vuông kích thước n×n. Các dòng được đánh số từ 1 đến n, từ dưới lên trên. Các
cột được đánh số từ 1 đến n từ trái qua phải.
Ô nằm trên giao của dòng i và cột j được gọi là ô (i,j). Trên bàn cờ có m (0 ≤ m ≤ n) quân
cờ. Với m > 0, quân cờ thứ i ở ô (r
i
, c
i
), i = 1,2, , m. Không có hai quân cờ nào ở trên
cùng một ô. Trong số các ô còn lại của bàn cờ, tại ô (p, q) có một quân tượng. Mỗi một
nước đi, từ vị trí đang đứng quân tượng chỉ có thể di chuyển đến được những ô trên cùng
đường chéo với nó mà trên đường đi không phải qua các ô đã có quân
Cần phải đưa quân tượng từ ô xuất phát (p, q) về ô đích (s,t). Giả thiết là ở ô đích không có
quân cờ. Nếu ngoài quân tượng không có quân nào khác trên bàn cờ thì chỉ có 2 trường
hợp: hoặc là không thể tới được ô đích, hoặc là tới được sau không quá 2 nước đi (hình
trái). Khi trên bàn cờ còn có các quân cờ khác, vấn đề sẽ không còn đơn giản như vậy.
Yêu cầu: Cho kích thước bàn cờ n, số quân cờ hiện có trên bàn cờ m và vị trí của chúng, ô
xuất phát và ô đích của quân tượng. Hãy xác định số nước đi ít nhất cần thực hiện để đưa
quân tượng về ô đích hoặc đưa ra số -1 nếu điều này không thể thực hiện được.
Input
Dòng đầu tiên chứa 6 số nguyên n, m, p, q, s, t.
Nếu m > 0 thì mỗi dòng thứ i trong m dòng tiếp theo chứa một cặp số nguyên ri , ci xác
định vị trí quân thứ i.
Hai số liên tiếp trên cùng một dòng được ghi cách nhau ít nhất một dấu cách.
Output
Gồm 1 dòng duy nhất là số nước đi tìm được
Example
QBBISHOP.INP QBBISHOP.OUT
8 3 7 2 1 4
5 4
3
3 4
4 7
Hạn chế:
Trong tất cả các test: 1 ≤ n ≤ 200. Có 60% số lượng test với n ≤ 20.
3. Gặm cỏ
Mã bài: VMUNCH
Bessie rất yêu bãi cỏ của mình và thích thú chạy về chuồng bò vào giờ vắt sữa buổi tối.
Bessie đã chia đồng cỏ của mình là 1 vùng hình chữ nhật thành các ô vuông nhỏ với R (1
<= R <= 100) hàng và C (1 <= C <= 100) cột, đồng thời đánh dấu chỗ nào là cỏ và chỗ nào
là đá. Bessie đứng ở vị trí R_b,C_b và muốn ăn cỏ theo cách của mình, từng ô vuông một
và trở về chuồng ở ô 1,1 ; bên cạnh đó đường đi này phải là ngắn nhất.
Bessie có thể đi từ 1 ô vuông sang 4 ô vuông khác kề cạnh.
Dưới đây là một bản đồ ví dụ [với đá ('*'), cỏ ('.'), chuồng bò ('B'), và Bessie ('C') ở hàng 5,
cột 6] và một bản đồ cho biết hành trình tối ưu của Bessie, đường đi được dánh dấu bằng
chữ ‘m’.
Bản đồ Đường đi tối ưu
1 2 3 4 5 6 <-cột 1 2 3 4 5 6 <-cột
1 B . . . * . 1 B m m m * .
2 . . * . . . 2 . . * m m m
3 . * * . * . 3 . * * . * m
4 . . * * * . 4 . . * * * m
5 * . . * . C 5 * . . * . m
Bessie ăn được 9 ô cỏ.
Cho bản đồ, hãy tính xem có bao nhiêu ô cỏ mà Bessie sẽ ăn được trên con đường ngắn
nhất trở về chuồng (tất nhiên trong chuồng không có cỏ đâu nên đừng có tính nhé)
Dữ liệu
• Dòng 1: 2 số nguyên cách nhau bởi dấu cách: R và C
• Dòng 2 R+1: Dòng i+1 mô tả dòng i với C ký tự (và không có dấu cách) như đã nói
ở trên.
Kết quả
• Dòng 1: Một số nguyên là số ô cỏ mà Bessie ăn được trên hành trình ngắn nhất trở
về chuồng.
Ví dụ
VMUNCH.INP VMUNCH.OUT
5 6
B *.
*
.**.*.
***.
* *.C
9
4. Bãi cỏ ngon nhất
Mã bài: VBGRASS
Bessie dự định cả ngày sẽ nhai cỏ xuân và ngắm nhìn cảnh xuân trên cánh đồng của nông
dân John, cánh đồng này được chia thành các ô vuông nhỏ với R (1 <= R <= 100) hàng và
C (1 <= C <= 100) cột. Bessie ước gì có thể đếm được số khóm cỏ trên cánh đồng.
Mỗi khóm cỏ trên bản đồ được đánh dấu bằng một ký tự ‘#‘ hoặc là 2 ký tự ‘#’ nằm kề
nhau (trên đường chéo thì không phải). Cho bản đồ của cánh đồng, hãy nói cho Bessie biết
có bao nhiêu khóm cỏ trên cánh đồng.
Ví dụ như cánh đồng dưới dây với R=5 và C=6:
.#
#
# #
##.
.#
Cánh đồng này có 5 khóm cỏ: một khóm ở hàng đầu tiên, một khóm tạo bởi hàng thứ 2 và
thứ 3 ở cột thứ 2, một khóm là 1 ký tự nằm riêng rẽ ở hàng 3, một khóm tạo bởi cột thứ 4
và thứ 5 ở hàng 4, và một khóm cuối cùng ở hàng 5.
Dữ liệu
• Dòng 1: 2 số nguyên cách nhau bởi dấu cách: R và C
• Dòng 2 R+1: Dòng i+1 mô tả hàng i của cánh đồng với C ký tự, các ký tự là ‘#’
hoặc ‘.’ .
Kết quả
• Dòng 1: Một số nguyên cho biết số lượng khóm cỏ trên cánh đồng.
Ví dụ
VBGRASS.INP VBGRASS.OUT
5 6
.#
#
# #
##.
.#
5
5. Tương đương hóa hai từ
Mã bài: VWORDS
Cho hai từ x, y và một dãy hữu hạn các từ (w
1
, w
2
, , w
k
).
Phép toán p * q mang ý nghĩa là phép nối từ p với từ q, hay nói cách khác p * q là một từ
mới tạo thành bằng cách viết từ q phía sau từ p. Ta cần kiểm tra xem hai từ x, y có thể
tương đương hóa bằng cách sử dụng các từ trong dãy cho trước không.
Ví dụ: Từ abba và ab có thể tương đương hóa bằng cách sử dụng các từ trong dãy: baaabad
aa badccaa cc. Ta cần nối vào từ abba các từ: aa và badccaa, và nối vào từ ab các từ
baaabad, cc và aa theo thứ tự. Trong cả hai trường hợp, ta sẽ thu được cùng một từ:
abbaaabadccaa.
Yêu cầu
Cho biết từ x, từ y và dãy từ w
1
, w
2
, , w
k
. Cho biết từ x và y có thể tương đương hóa bằng
cách sử dụng các từ trong dãy cho trước được hay không? Nếu có thể, hãy tìm số lượng
nhỏ nhất phép toán * cần sử dụng.
Dữ liệu
• Dòng đầu tiên chứa một số nguyên dương k ≤ 40.
• Dòng thứ hai và dòng thứ ba mô tả từ x và y.
• K dòng tiếp theo mô tả dãy từ w
1
, w
2
, , w
k
, mỗi từ trên một dòng.
• Mô tả của mỗi từ chứa một số nguyên cho biết độ dài của từ, theo sau bởi khoảng
trắng và một chuỗi thể hiện từ đó.
• Mỗi từ chỉ bao gồm các chữ cái Latin in thường và có độ dài không vượt quá 2000.
• Tổng độ dài các từ không vượt quá 5000.
Kết quả
• Nếu không tồn tại lời giải, in ra 'NIE'.
• Nếu tồn tại lời giải, in ra một số nguyên dương, là số lượng nhỏ nhất các phép toán *
cần để tương đương hóa hai từ x và y.
Ví dụ
VWORDS.INP VWORDS.OUT
4
4 abba
2 ab
7 baaabad
2 aa
7 badccaa
2 cc
5
4
1 a
2 ab
2 bb
2 ab
2 ba
2 aa
NIE
6. GUMBI
Mã bài: LEM2
Một TV có N phím bấm đánh số 1 N. Trước đây TV còn tốt, khi ấn 1 phím xuống mọi
phím khác đều tắt và chỉ có phím vừa ấn là bật. Bây giờ TV đã cũ, khi ấn 1 phím,chỉ có 1
số phím khác tắt(nếu nó đang bật), các phím khác không đổi
Một phím dù đang bật hay tắt khi ta ấn nó thì phím này sẽ bật. Các phím bị nó tác động sẽ
tắt nếu đang bật.
Bạn được cho biết kết quả bấm của mỗi phím và 1 hiện trạng của các phím. Hãy tìm 1 dãy
bấm liên tiếp 1 số ít nhất phím sao cho cuối cùng chỉ còn lại phím K, 1 <= K <= N, là bật
các phím còn lại đều tắt.
Input
- Gồm 1 test duy nhất:
- Dòng đầu là 2 số nguyên N, K ( 3 ≤ N ≤ 20 )
- N dòng tiếp theo, dòng thứ i:
* Đầu tiên là số S ( số phím mà phím i tác động ) . Tiếp theo S số là dãy phím mà phím i
tác động khi bật nó
- Dòng cuối là N số 0 or 1 mô tả hiện trạng bàn phím đang tắt or bật
Output
- Gồm 1 số nguyên duy nhất là số lần bấm phím ít nhất. Nếu ko có đáp án ghi ra -1
Example
LEM2.INP LEM2.OUT
3 3
2 2 3
2 1 3
2 1 2
1 1 0
1
4 3
3 2 3 4
1 1
1 1
0
0 1 0 1
2
Chuyên đề DFS
1. Quảng cáo
Mã bài: ADS
Nhân dịp Tết sắp đến công ty Jelly-for-Kids quyết định tăng cường việc quảng bá sản
phẩm đến người tiêu dùng. Vì thế giám đốc marketing, ông Fruit-Jelly muốn gửi đi số
lượng nhân viên tối đa có thể, làm nhiệm vụ tiếp thị tại đại lý trong thành phố
Trong thành phố có m con đường, n đại lý bán kẹo (đánh số từ 1 đến n). Mỗi con đường
chỉ nối trực tiếp giữa 2 đại lý, và được ký hiệu bằng chỉ số của 2 đại lý mà nó nối. Đồng
thời, giữa 2 đại lý bất kỳ có không quá 1 con đường nối chúng
Ông Fruit-Jelly nghĩ rằng, ông ta sẽ quản lý nhân viên dễ hơn nếu xếp mỗi người tiếp thị
trên những hành trình có tính chất thứ tự. Tức là những đại lý bán kẹo trên hành trình đó
thỏa các điều kiện sau
Có đường nối trực tiếp giữa 2 đại lý liên tiếp nhau trên hành trình
Từ một đại lý bất kỳ trong hành trình có thể đi qua tất cả các đoạn đường trong hành trình
đó rồi trở về nơi xuất phát mà không đi qua đoạn đường nào quá một lần
Hành trình phân công cho mỗi nhân viên phải có ít nhất một đoạn đường chưa có nhân
viên nào khác đi tiếp thị.
Mỗi nhân viên chỉ di chuyển trên hành trình mà anh ta được phân công. Hãy tính số lượng
nhân viên tối đa mà ông Fruit-Jelly có thể xếp việc, và hành trình cụ thể mà mỗi người
được xếp.
Input
Dòng đầu là 2 số tự nhiên N và M (N<=2000) (M<=5000)
Trong M dòng tiếp theo, mỗi dòng ghi 2 số nguyên mô tả một đoạn đường, mỗi đoạn
đường được mô tả bởi chỉ số của 2 đại lý mà nó nối.
Output
Dòng đầu tiên ghi Q là số lượng nhân viên tối đa tìm được
Example
ADS.INP ADS.OUT
5 6 2
1 2
2 4
4 5
3 5
1 3
2 3
2. Truyền tin
Mã bài: MESSAGE
Một lớp gồm N học sinh, mỗi học sinh cho biết những bạn mà học sinh đó có thể liên lạc
được (chú ý liên lạc này là liên lạc một chiều : u có thể gửi tin tới v nhưng v thì chưa chắc
đã có thể gửi tin tới u).
Thầy chủ nhiệm đang có một thông tin rất quan trọng cần thông báo tới tất cả các học sinh.
Để tiết kiệm thời gian, thầy chỉ nhắn tin tới 1 số học sinh rồi sau đó nhờ các học sinh này
nhắn lại cho tất cả các bạn mà các học sinh đó có thể liên lạc được, và cứ lần lượt như thế
làm sao cho tất cả các học sinh trong lớp đều nhận được tin .
Hãy tìm một số ít nhất các học sinh mà thầy chủ nhiệm cần nhắn.
Input
- Dòng đầu là N, M (N <= 800, M là số lượng liên lạc 1 chiều)
- Một số dòng tiếp theo mỗi dòng gồm 2 số u , v cho biết học sinh u có thể gửi tin tới học
sinh v
Output
- Gồm 1 dòng ghi số học sinh cần thầy nhắn tin.
Example
MESSAGE.INP MESSAGE.OUT
12 15
1 3
3 6
6 1
2
6 8
8 12
12 9
9 6
2 4
4 5
5 2
4 6
7 10
10 11
11 7
10 9
3. Bộ ba cao thủ
Mã bài: NKTRIO
Ở thời loạn, giang hồ có rất nhiều cao thủ võ lâm, mỗi người trong số họ lại có những tuyệt
chiêu. Nếu 2 cao thủ giang hồ so tài với nhau thì từ những sở trường và sở đoản của họ, ta
có thể biết trước được cao thủ nào sẽ thắng. Những cao thủ đang có ở VNOI như
conankudo, gothdn, kaiel, nahnhnahk, pirate đang muốn thi tài để xem ai được chọn làm
bộ ba cao thủ.
Để mưu nghiệp lớn, minh chủ võ lâm Nuga cần tìm ra một bộ ba trong số các cao thủ
giang hồ hiện tại. Để các cao thủ này quy phục dưới trướng của mình và không làm phản,
Nuga muốn bộ ba cao thủ này có thể khắc chế được nhau; điều này có nghĩa là nếu 3 cao
thủ được chọn là A, B và C thì A phải thắng được B, B phải thắng được C và C phải thắng
được A.
Bạn hãy giúp Nuga chọn ra một bộ ba cao thủ thoả mãn yêu cầu của ông.
Dữ liệu:
Dòng đầu tiên ghi n là số cao thủ trên giang hồ (3 ≤ n ≤ 1000)
Tiếp theo là n dòng, mỗi dòng có n số. A[i,j] = 1 là người i thắng j. Dữ liệu luôn đảm bảo
A[i,j] + A[j,i] = 1. A[i,i] = 0 với mọi i.
Kết quả:
Ghi ra ba số nguyên A, B và C là thứ tự của ba cao thủ thoả mãn A thắng B, B thắng C và
C thắng A. Trong trường hợp có nhiều cách lựa chọn, bạn chỉ cần chỉ ra một cách; trong
trường hợp không có cách lựa chọn thoả mãn yêu cầu, ghi ra ba số -1.
Ví dụ:
NKTRIO.INP NKTRIO.OUT
5 2 3 5
0 1 1 1 0
0 0 1 1 0
0 0 0 0 1
0 0 1 0 0
1 1 0 1 0
3
0 1 1
0 0 1
0 0 0
-1 -1 -1
4. Mạng máy tính an toàn
Mã bài: SAFENET2
Có n máy tính đánh số từ 1 đến n và m dây cáp mạng,giữa 2 máy tính có thể có một hoặc
nhiều đường dây cáp mạng nối chúng,không có cáp mạng nối một máy với chính nó.Hai
máy tính có thể truyền dữ liệu cho nhau nếu có đường cáp nối trực tiếp giữa chúng hoặc
truyền qua một số máy trung gian.
Một tập S các máy tính được gọi là hệ thống an toàn nếu dù một máy tính bất kỳ bị tấn
công (do sự tò mò của người dân :-(,cứ thích truy cập và hack những trang cấm :-( ) thì
trong số những máy tính còn lại,những máy tính thuộc tập S vẫn có thể truyền được dữ
liệu cho nhau. Xác định số lượng lớn nhất có thể các máy tính của tập S
Input
-Dòng 1 chứa 2 số nguyên n,m(1<=n<=30.000,0<=m<=100.000)
-m dòng tiếp theo ghi thông tin về các dây cáp mạng,gồm 2 chỉ số của 2 máy được dây đó
nối trực tiếp
Output
Ghi một số nguyên duy nhất là số lượng máy tính lớn nhất tìm đc
Example
SAFENET2.INP SAFENET2.OUT
8 10
1 2
2 3
3 1
1 4
4 5
5 1
1 6
6 7
7 8
8 1
4
5. Vòng đua xe đạp
Mã bài: BIC
Một vòng đua xe đạp được tổ chức trên N thành phố, đánh số từ 1 đến N. Có M đường nối
(một chiều) giữa các thành phố. Vòng đua bắt đầu từ thành phố 1 và kết thúc tại thành phố
2.
Yêu cầu
Hỏi có bao nhiêu cách tổ chức các vòng đua? (Biết hai vòng đua là khác nhau nếu chúng
không sử dụng các tuyến đường như nhau)
Dữ liệu
Dòng 1: N, M
M dòng tiếp theo: mỗi dòng chứa hai số nguyên A, B, cho biết có một đường nối giữa
thành phố A và thành phố B
Các thành phố có thể nối với nhau bởi nhiều hơn một con đường
Kết qủa
Gồm 1 dòng duy nhất: số cách tổ chức các vòng đua. Nếu kết qủa có nhiều hơn 9 chữ số,
chỉ cần in ra 9 chữ số cuối cùng. Nếu có vô số cách tổ chức các đường đua, in ra “inf”.
Giới hạn
• 1 ≤ N ≤ 10
4
• 1 ≤ M ≤ 10
5
Ví dụ
BIC.INP BIC.OUT
8 14
6 7
6 8
7 5
5 2
5 3
4 8
1 6
5 2
7 5
6 4
1 4
5 2
7 4
8 3
6
2 2
1 2
2 1
inf
6. Xây cầu
Mã bài: BRIDGES
Đất nước Delta là quốc đảo lớn trên thế giới. Đất nước gồm N đảo nhỏ được đánh số từ 1
đến N. Việc đi lại giữa các đảo là rất khó khăn. Vì kinh tế còn rất kém phát triển, nhà nước
phải khó khăn lắm mới mở được N – 1 tuyến phà biển để người dân người dân có thể đi lại
được giữa hai đảo bất kì. Cách đây không lâu, đất nước mới nhận được sự đầu tư lớn của
các nước tư bản. Nhà vua quyết định xây mới K cây cầu để thay cho K tuyến phà. Các cây
cầu mới được xây dựng sẽ nối liền hai đảo mà trước đây có tuyến phà nối trực tiếp. Nhà
vua muốn tính toán để chọn K tuyến phà nào để xây thành cầu sau cho tổng thời gian để đi
lại giữa mọi cặp đỉnh là nhỏ nhất. Tức là: đạt giá trị nhỏ nhất. Trong đo T
A B
là thời gian đi từ đảo A đến đảo B. Bạn hãy giúp nhà Vua tính toán chọn ra K trong số N -
1 tuyến phà để thay thế bằng cầu.
Input
• Dòng thứ nhất ghi 4 số nguyên N, K, V
P
, V
C
trong đó V
P
là vận tốc nếu đi bằng phà
và V
C
là vận tốc nếu đi bằng cầu. V
P
và V
C
có đơn vị là m/s
• N – 1 dòng tiếp theo, mỗi dòng ghi 3 số U V L thể hiện giữa đảo U và đảo V đã có
một tuyến phà, và khoảng cách giữa U và V là L mét.
Output
In ra K số là số hiệu của tuyến phà cần được thay thế bằng cầu.
Giới hạn
• 1 ≤ K < N ≤ 10 000
• 1 ≤ V
P
, V
C
≤ 100 000
• 1 ≤ L
U V
≤ 10
6
• Thời gian: 1s/test
Example
BRIDGES.INP BRIDGES.OUT
6 2 1 2
1 2 5
3 2 6
1 4 4
4 6 4
4 5 5
1 3
Chuyên đề: ĐƯỜNG ĐI NGẮN NHẤT
1. Bin Laden
Mã bài: BINLADEN
Trùm khủng bố Bin Laden trốn trong 1 căn hầm được đào sâu xuống mặt đất M tầng, mỗi
tầng có N phòng. Các phòng được ngăn cách bằng các cửa rất khó phá. Các phòng có cửa
xuống phòng ngay phía dưới và 2 phòng ở 2 bên. Từ trên mặt đất có N cửa xuống N phòng
tầng -1. Bin Laden ở tầng dưới cùng (tầng -M) phòng thứ N (phòng ở bên phải nhất). Mỗi
cửa được làm bằng một kim loại khác nhau với độ dày khác nhau nên việc phá cửa cần
thời gian khác nhau.
Bạn hãy tìm cách đi từ mặt đất xuống phòng của Bin Laden nhanh nhất không hắn thoát
mất.
Dữ liệu
• Dòng 1 ghi M và N
• Dòng 2 đến 2M + 1, dòng chẵn ghi N số, dòng lẻ ghi N - 1 số là chi phí để phá cửa.
Kết quả
Ghi ra 1 số là thời gian nhỏ nhất để đến được phòng của Bin Laden
Ví dụ
BINLADEN.INP BINLADEN.OUT
4 2 44
99 10
1
10 99
1
99 10
1
10 99
1
+ 99 + 10 +
| | |
| 1 |
| | |
+ 10 + 99 +
| | |
| 1 |
| | |
+ 99 + 10 +
| | |
| 1 |
| | |
+ 10 + 99 +
| | |
| 1 |
| | |
+ + +
Đi theo đường zigzac
Giới hạn
• 1 <= M <= 2222
• 1 <= N <= 10
• Chi phí của các cánh cửa thuộc [0, 1000].
2. Xúc xắc
Mã bài: XUCXAC
Một mặt bàn nằm ngang được chia làm lưới ô vuông, trong mỗi ô có ghi một số tự nhiên.
Cho 1 con xúc xắc nằm vừa vặn trên một ô của lưới. Mỗi mặt của xúc xắc là một số từ 1
đến 6. Ban đầu, mặt trước là số 1, mặt trên là số 2 và mặt bên phải là số 3, các mặt đối diện
có tổng số là 7. Mỗi lần, con xúc xắc có thể lăn về phía trái, phải, trước, sau. Mỗi lần tiếp
xúc với mặt bàn, ta mất một chi phí bằng số ghi trên ô mà xúc xắc đang nằm trên nhân với
số trên mặt của xúc xắc đang tiếp xúc với mặt bàn.
Hãy tìm cách lăn từ một ô đến một ô khác trên mặt bàn để đạt chi phí nhỏ nhất.
Dữ liệu
• Dòng đầu ghi 2 số M, N lần lượt là số dòng và số cột của lưới ô trên mặt bàn.
• M dòng sau, mỗi dòng ghi N số nguyên không quá 100 là số ghi trên các ô lưới của
mặt bàn. Các dòng được liệt kê theo thứ tự từ xa đến gần, các số trên mỗi dòng liệt
kê từ trái sang phải.
• Dòng cuối ghi 2 cặp số lần lượt là tọa độ (dòng, cột) của ô bắt đầu và ô kết thúc.
Kết quả
Ghi ra một số duy nhất là chi phí nhỏ nhất tìm được.
Giới hạn
1 ≤ M,N ≤ 50.
Ví dụ
XUCXAC.INP XUCXAC.OUT
3 3
1 2 3
4 5 6
7 8 9
2 2 3 3
52
3. Traffic Network
Mã bài: TRAFFICN
Mạng lưới giao thông thành phố gồm n nút được đánh số từ 1 đến n và m đường một chiều
nối các cặp nút. Để giảm được độ dài của đường đi ngắn nhất giữa hai nút trọng yếu s và t
khác nhau, một danh sách gồm k đường hai chiều được đề xuất để xem xét xây dựng.
Nhiệm vụ của bạn là viết một chương trình để chọn ra một đường trong danh sách đề xuất
trên để xây dựng sao cho độ dài đường đi ngắn nhất giữa s và t là nhỏ nhất.
Dữ liệu vào
Dữ liệu vào gồm nhiều bộ dữ liệu tương ứng với nhiều test. Dòng đầu tiên chứa một số
nguyên dương không lớn hơn 20 là số lượng các bộ dữ liệu. Các dòng tiếp theo chứa các
bộ dữ liệu.
Với mỗi bộ dữ liệu, dòng đầu tiên chứa năm số nguyên dương n (n ≤ 10 000), m (m ≤ 100
000), k (k < 300), s (1 ≤ s ≤ n), t (1 ≤ t ≤ n) cách nhau bởi dấu trống. Dòng thứ i trong m
dòng tiếp theo chứa ba số nguyên dương di, ci, li cách nhau bởi dấu trống, trong đó li là độ
dài ( 0< li ≤ 1000) của đường một chiều thứ i từ nút di đến nút ci. Dòng thứ j trong k dòng
tiếp theo chứa ba số nguyên dương uj, vj và qj (qj ≤ 1000) cách nhau bởi dấu trống, trong
đó qj là độ dài của đường hai chiều được đề xuất thứ j nối giữa hai nút uj và vj.
Dữ liệu ra
Với mỗi bộ dữ liệu, ghi ra trên một dòng độ dài nhỏ nhất có thể của đường đi ngắn nhất
giữa hai nút trọng yếu sau khi xây dựng xong một đường hai chiều từ danh sách đề xuất.
Trường hợp không có đường đi từ s đến t, ghi -1.
Dữ liệu vào
TRAFFICN.INP TRAFFICN.OUT
1
4 5 3 1 4
1 2 13
2 3 19
3 1 25
3 4 17
4 1 18
1 3 23
2 3 5
2 4 25
35
4. Roads
Mã bài: ROADS
Có N thành phố 1 N nối bởi các con đường một chiều. Mỗi con đường có hai giá trị: độ
dài và chi phí phải trả để đi qua. Bob ở thành phố 1. Bạn hãy giúp Bob tìm đường đi ngắn
nhất đến thành phố N, biết rằng Bob chỉ có số tiền có hạn là K mà thôi.
Dữ liệu
Dòng đầu tiên ghi t là số test. Với mỗi test, dòng đầu ghi K (0 ≤ K ≤ 10000). Dòng 2 ghi
N, 2 ≤ N ≤ 100. Dòng 3 ghi R, 1 ≤ R ≤ 10000 là số đường nối. Mỗi dòng trong N dòng sau
ghi 4 số nguyên S, D, L, T mô tả một con đường nối giữa S và D với độ dài L ( 1 ≤ L ≤
100) và chi phí T (0 ≤ T ≤ 100). Lưu ý có thể có nhiều con đường nối giữa hai thành phố.
Kết quả
Với mỗi test, in ra độ dài đường đi ngắn nhất từ 1 đến N mà tổng chi phí không quá K.
Nếu không tồn tại, in ra -1.
Ví dụ
ROADS.INP ROADS.OUT
2
5
6
7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
11
-1
3 5 2 0
5 4 3 2
0
4
4
1 4 5 2
1 2 1 0
2 3 1 1
3 4 1 0
5. Vị trí tốt nhất
Mã bài: BESTSPOT
Bessie, luôn luôn muốn cuộc sống của mình tốt hơn , đã thấy rõ rằng cô ta thật sự rất thích
ghé thăm F (1 <= F <= P) cánh đồng yêu thích F_i trong tổng số P (1 <= P <= 500;1 <=
F_i <= P) cánh đồng (được đánh số từ 1-> P) thuộc sơ hữu của nông dân John.
Bessie biết rằng cô ấy có thể xác định được C (1 <= C <= 8000) con đường hai chiều
(được đánh số 1 C) kết nối tất cả các cánh đồng trong toàn bộ nông trại. Ứng với mỗi con
đường P_i là thời gian đi T_i (1 <= T_i <= 892) và nối 2 cánh đồng a_i và b_i (1 <= a_i <=
P; 1 <= b_i <= P).
Bessie muốn tìm cánh đồng tốt nhất để ngủ thỏa mãn bình quân thời gian để đi đến F cánh
đồng yêu thích của cô ta là nhỏ nhất.
Ví dụ, hãy xem xét một nông trang được trình bày như một bản đồ dưới đây , nơi * 'd là
cách đồng được yêu thích.Các số trong ngoặc là thời gian tương ứng để di chuyển giữa 2
cánh đồng .
1 * [4] - 2 - [2] - 3
| |
[3] [4]
| |
4 - [3] - 5 - [1] 6 [6] 7 - [7] - 8 *
| | | |
[3] [2] [1] [3]
| | | |
13 * 9 - [3] - 10 * [1] - 11 * [3] - 12 *
Bảng sau đây cho thấy các khoảng cách trung bình nếu nghỉ tại các cánh đồng 4, 5, 6, 7, 9,
10, 11, và 12: 4 7 16 5 6 9 3 46/6 = 7.67 5 10 13 2 3 6 6 40/6 = 6.67 6 11 12 1 2 5 7 38/6 =
6.33 7 16 7 4 3 6 12 48/6 = 8.00 9 12 14 3 4 7 8 48/6 = 8.00 10 12 11 0 1 4 8 36/6 = 6.00
** BEST 11 13 10 1 0 3 9 36/6 = 6.00 12 16 13 4 3 0 12 48/6 = 8.00
Kết quả tối ưu là cánh đồng 10
Dữ liệu
• Dòng 1: 3 số nguyên P,F,C
• Dòng 2 F+1: Dòng i+2 chứa 1 số Nguyên F_i
• Dòng F+2 C+F+1 : Mỗi dòng chứa 3 số Nguyên a_i, b_i, F_i mô tả 1 con đường 2
chiều là thời gian di chuyển giữa chúng.
Kết quả
Gồm 1 dòng duy nhất là cánh đồng được chọn . nếu có nhiều kết quả , chọn cánh đồng có
chỉ số nhỏ nhất !
Ví dụ
BESTSPOT.INP BESTSPOT.INP
13 6 15
11
13
10
12
8
1
2 4 3
7 11 3
10 11 1
4 13 3
9 10 3
2 3 2
3 5 4
5 9 2
6 7 6
5 6 1
1 2 4
4 5 3
11 12 3
6 10 1
7 8 7
10