Nguồn đề bài: VCOLDWAT
1. Đề bài VCOLDWAT spoj
Mùa hè oi ả ở Wisconsin đã khiến cho lũ bò phải đi tìm nước để làm dịu đi cơn khát. Các đường ống dẫn nước của nông dân John đã dẫn nước lạnh vào 1 tập N (3 <= N <= 99999; N lẻ) nhánh (đánh số từ 1..N) từ một cái bơm đặt ở chuồng bò.
Khi nước lạnh chảy qua các ống, sức nóng mùa hè sẽ làm nước ấm lên. Bessie muốn tìm chỗ có nước lạnh nhất để cô bò có thể tận hưởng mùa hè một cách thoải mái nhất.
Bessie đã vẽ sơ đồ toàn bộ các nhánh ống nước và nhận ra rằng nó là một đồ thị dạng cây với gốc là chuồng bò và ở các điểm nút ống thì có chính xác 2 nhánh con đi ra từ nút đó. Một điều ngạc nhiên là các nhánh ống này đều có độ dài là 1.
Cho bản đồ các ống nước, hãy cho biết khoảng cách từ chuồng bò tới tất cả các nút ống và ở các phần cuối đường ống.
“Phần cuối” của một đường ống, có thể là đi vào một nút ống hoặc là bị bịt, được gọi theo số thứ tự của đường ống. Bản đồ có C (1 <= C <= N) nút ống, được mô tả bằng 3 số nguyên: là “phần cuối” của ống E_i (1 <= E_i <= N) và 2 ống nhánh đi ra từ đó là B1_i và B2_i (2 <= B1_i <= N; 2 <= B2_i <= N). Đường ống số 1 nối với chuồng bò; khoảng cách từ phần cuối của đường ống này tới chuồng bò là 1.
Dữ liệu
Dòng 1: 2 số nguyên cách nhau bởi dấu cách: N và C
Dòng 2..C+1: Dòng i+1 mô tả nút ống i với ba Số nguyên cách nhau bởi dấu cách: E_i, B1_i, và B2_i
Kết quả
Dòng 1..N: Dòng i chứa 1 số nguyên là khoảng cách từ chuồng tới “phần cuối” của ống thứ i.
Ví dụ
Dữ liệu
5 2
3 5 4
1 2 3
Giải thích:
Dữ liệu ở trên mô tả bản đồ ống nước sau:
Kết quả
1
2
2
3
3
Giải thích:
Ống 1 luôn cách chuồng 1 đoạn là 1. Ống 2 và 3 nối với ống 1 nên khoảng cách sẽ là 2. Ống 4 và 5 nối với ống 3 nên
khoảng cách sẽ là 3.
2. Code tham khảo VCOLDWAT spoj
a. Code pascal
const fi=''; nmax=100000; type data=longint; chuong=record x,y:data; end; var f:text; N,C:data; A:array[1..nmax] of chuong; B:array[1..nmax] of data; procedure docfile; var i,tmp:data; begin assign(f,fi); reset(f); readln(f,n,c); for i:=1 to n do begin a[i].x:=0; a[i].y:=0; end; for i:=1 to c do readln(f,tmp,A[tmp].x,a[tmp].y); close(f); end; procedure try(i:data); begin if (a[i].x=0) or (a[i].y=0) then exit; b[ a[i].x]:=b[i]+1; b[ a[i].y]:=b[i]+1; try( a[i].x ); try( a[i].y ); end; procedure xuli; var i:data; begin b[1]:=1; for i:=2 to n do b[i]:=0; try(1); for i:=1 to n do writeln(B[i]); end; begin docfile; xuli; end.
b. Code c++
#include <bits/stdc++.h> using namespace std; class Node { public: int ten,d; Node(int ten, int d) { this->ten=ten; this->d=d; } }; int n,c; vector<int> l,r,f; void Init() { scanf("%d%d",&n,&c); f.resize(n+2); l.resize(n+2); r.resize(n+2); for (int i=0;i<c;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); l[a]=b; r[a]=c; } } void Solve() { queue<Node> que; que.push(Node(1,1)); while(!que.empty()) { Node t=que.front(); que.pop(); f[t.ten]=t.d; if(l[t.ten]) { que.push(Node(l[t.ten],t.d+1)); que.push(Node(r[t.ten],t.d+1)); } } for (int i=1;i<=n;i++) printf("%dn",f[i]); } int main() { Init(); Solve(); }