canuc80k2711·12/50

Ba Đỉnh Khép Kín

Nộp bài trên LQDOJ

Bài 27 · Bitset

Cho một đồ thị vô hướng đơn gồm đỉnh, được đánh số từ đến . Đồ thị được cho bằng ma trận kề: ký tự thứ của dòng bằng khi có cạnh nối hai đỉnh và , và bằng nếu không có. Hãy đếm số bộ ba đỉnh phân biệt mà mọi cặp đỉnh trong bộ ba đều có cạnh nối.

Input

  • Dòng đầu chứa .
  • dòng tiếp theo, mỗi dòng là một chuỗi nhị phân dài đúng biểu diễn một hàng của ma trận kề.

Output

  • In số tam giác của đồ thị.

Constraints

  • .
  • Ma trận là đối xứng, mọi phần tử trên đường chéo chính bằng , và mỗi cặp đỉnh có nhiều nhất một cạnh.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5
01100
10110
11010
01100
00000

Output

2

Giải thích: Hai tam giác là và . Đỉnh không nối với đỉnh nào nên không thuộc tam giác.

Lời giải tóm tắt
  • Mô hình và ý tưởng: Lưu tập láng giềng của mỗi đỉnh bằng bitset. Với từng cạnh (i,j) và i<j, popcount của adj[i] & adj[j] là số đỉnh thứ ba tạo tam giác với cạnh đó. Tổng này đếm mỗi tam giác qua ba cạnh nên chia cho 3.
  • Chứng minh tính đúng đắn: Với một cạnh i-j, bit k nằm trong adj[i]&adj[j] đúng khi tồn tại cả hai cạnh i-k và j-k, tức ba đỉnh tạo tam giác. Mỗi tam giác được gặp qua đúng ba cạnh của nó trong vòng lặp i<j, nên tổng chia 3 là số tam giác.
  • Độ phức tạp: O(N³/w) thời gian và O(N²/w) bộ nhớ.
  • Lỗi cài đặt thường gặp: chia cho 6 thay vì 3; không kiểm tra cạnh i-j.