| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 763307 | vjudge1 | Power Plant (JOI20_power) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
vector<vector<int>> graph; // Đồ thị lưu kết nối giữa các căn cứ
vector<bool> hasGenerator; // Mảng lưu trạng thái có máy phát điện hay không
vector<bool> visited; // Mảng lưu trạng thái đã thăm của các căn cứ
int profit = 0; // Biến lưu tổng lợi nhuận
// Hàm DFS để duyệt đồ thị và tính lợi nhuận tối đa
void dfs(int node, bool isBroken) {
visited[node] = true;
// Nếu căn cứ hiện tại có máy phát điện và không hỏng
if (hasGenerator[node] && !isBroken) {
profit++;
isBroken = true; // Đánh dấu máy phát điện bị hỏng
}
// Duyệt qua tất cả các căn cứ kề với căn cứ hiện tại
for (int i = 0; i < graph[node].size(); i++) {
int neighbor = graph[node][i];
if (!visited[neighbor]) {
dfs(neighbor, isBroken);
}
}
}
int main() {
int N;
cin >> N; // Nhập số lượng căn cứ
graph.resize(N + 1); // Cấp phát bộ nhớ cho đồ thị
hasGenerator.resize(N + 1); // Cấp phát bộ nhớ cho mảng hasGenerator
visited.resize(N + 1); // Cấp phát bộ nhớ cho mảng visited
// Đọc thông tin về máy phát điện của từng căn cứ
for (int i = 1; i <= N; i++) {
int generator;
cin >> generator;
hasGenerator[i] = (generator == 1); // 1: có máy phát điện, 0: không có máy phát điện
}
// Đọc thông tin về kết nối giữa các căn cứ
for (int i = 0; i < N - 1; i++) {
int base1, base2;
cin >> base1 >> base2;
graph[base1].push_back(base2);
graph[base2].push_back(base1);
}
// Duyệt qua từng căn cứ để tính lợi nhuận tối đa
for (int i = 1; i <= N; i++) {
memset(&visited[0], false, visited.size() * sizeof(visited[0])); // Reset mảng visited trước mỗi lần duyệt
dfs(i, false);
}
// Tính tổng lợi nhuận
int totalProfit = profit - (N - profit);
cout << totalProfit << endl;
return 0;
}
