HSG_Tin12_Đồng Tháp_2019_2020
Câu 1:
(Mang tính chất tham khảo)
-Đánh dấu, cho i chạy từ 1 đến số chưa được đánh dấu. O(n)
int C2(){
cin >> n;
for (int i = 1; i <=amax; i ++ ) //amax = 10^5
a[i] = 0;
for (int i =0; i int x;
cin >> x;
a[x] = 1;
}
int ans = 1;
while (a[ans] == 1){
ans ++;
}
return ans;
}
Câu 2: Bài toán cái túi, quy hoạch động, với số lượng không giới hạn.
-Gọi F[i] là giá trị tốt nhất thõa mãn khối lượng i, lần lượt xét từng mặt hàng
thứ j. O(m.n)
=> Kết quả: F[m].
int result(){
for (int i = 1; i<= m;i++)
for (int j = 1; j <= n ; j ++)
if (i < w[j])
f[i] = max(f[i], f[i-1]);
else
f[i] = max(f[i], f[i-w[j]]+v[j]);
return f[m];
}
Câu 3: Đồ thị, thuật tốn tìm đường đi ngắn nhất.
- Thuật tốn BFS, danh sách kề. O(n)
- Head[i] là chỉ số kết thúc của đoạn quản lí đỉnh kề của i-1. Hay Head[i]+1 là chỉ số
bắt đầu của đoạn quản lí đỉnh kề của i. => Chỉ số của đoạn chứa các đỉnh kề của i là
từ Head[i]+1 đến Head[i+1].
- Các đỉnh kề của đỉnh u: Adj[v] , v = Head[u]+1 … Head[u+1].
- Đọc dữ liều đầu vào:
void Doc(){
cin >> n >> s >> t;
for (int i=0; i<= n+1; i++)
Head[i]=0;
for (int i=1; I <= n; i++){
cin >> x[i] >> y[i];
Head[x[i]]++;
Head[y[i]]++;
}
}
-Hàm khởi tạo: avail[i]= true nếu chưa xét, ngược lại.
void Init(){
for (int i=2; i<=n+1; i++)
Head[i]=Head[i-1]+Head[i];
for (int i=1; i<= n; i++){
Adj[Head[x[i]]]=y[i];
Head[x[i]]--;
}
Adj[Head[y[i]]]=x[i];
Head[y[i]]--;
for (int i = 1; i <= n; i ++)
avail[i] = true;
avail[s] = false;
}
-Hàm BFS(): Q[]: hàng đợi
void BFS(){
int d = 1, c = 1;
Q[1] = s;
do{
int u = Q[d];
d ++;
for (int i = Head[u]+1; i <= Head[u+1]; i ++)
if (avail[Adj[i]]){
c ++;
Q[c] = Adj[i];
avail[Adj[i]] = false;
trace[Adj[i]] = u;
}
}while (c >= d);
}
- Dữ liều đầu ra: avail[t] = true => khơng có đường đi tới t.
int Result(){
if (avail[t])
return 0;
}
int ans = 0;
while(t != s){
ans ++;
t = trace[t];
}
return ans-1;
- Hàm main:
int main(){
Doc();
Init();
BFS();
cout<< Result();
return 0;
}