- #include <bits/stdc++.h>
- //#include <iostream>
- //#include <vector>
- using namespace std;
- int main() {
- int M, N;
- cin >> M >> N;
-
- vector<vector<int>> adjMatrix(M, vector<int>(M, 0)); // 建立 M x M 的鄰接矩陣
- vector<int> degree(M, 0); // 紀錄每個節點的度數
-
- for (int i = 0; i < N; i++) {
- int a, b;
- cin >> a >> b;
- a--; b--; // 轉換為 0-based index
- adjMatrix[a][b] = 1;
- adjMatrix[b][a] = 1;
- degree[a]++;
- degree[b]++;
- }
-
- // 判斷是否滿足 Euler Path 條件
- int oddCount = 0;
- for (int i = 0; i < M; i++) {
- if (degree[i] % 2 == 1) {
- oddCount++;
- }
- }
-
- if (oddCount == 0 || oddCount == 2) {
- cout << "YES" << endl;
- } else {
- cout << "NO" << endl;
- }
-
- // 輸出鄰接矩陣
- for (int i = 0; i < M; i++) {
- for (int j = 0; j < M; j++) {
- cout << adjMatrix[i][j];
- if (j < M - 1) cout << " "; // 確保數字間有空格但行尾無多餘空格
- }
- cout << endl;
- }
-
- return 0;
- }
複製代碼 回復 1# may
--------------------------------------------------------
程式說明:
輸入處理
讀取節點數 M 和邊數 N。
建立 M x M 的鄰接矩陣 adjMatrix,並初始化為 0。
建立 degree 陣列,儲存每個節點的度數。
讀取邊資訊
讀取 N 條邊,每條邊 (a, b) 代表 a 和 b 之間有連接。
由於節點編號從 1 開始,因此轉換為 0-based index。
在 adjMatrix 中標記 1 表示有邊,並更新度數 degree[a] 和 degree。
判斷一筆畫條件
計算度數為奇數的節點數 oddCount。
若 oddCount == 0(尤拉迴路)或 oddCount == 2(尤拉路徑),則輸出 "YES",否則輸出 "NO"。
輸出鄰接矩陣
遍歷 adjMatrix 並輸出矩陣內容,數字間以空格隔開。
------------------------------------------
測資
測資00:Euler 路徑 (符合條件,應輸出 YES)
4 3
1 2
2 3
3 4
預期輸出
YES
0 1 0 0
1 0 1 0
0 1 0 1
0 0 1 0
測資01:Euler 迴路 (所有點度數皆為偶數,應輸出 YES)
4 4
1 2
2 3
3 4
4 1
預期輸出
YES
0 1 0 1
1 0 1 0
0 1 0 1
1 0 1 0
測資 02:無法一筆畫 (奇數度數超過 2 個,應輸出 NO)
5 4
1 2
2 3
3 4
4 5
預期輸出
NO
0 1 0 0 0
1 0 1 0 0
0 1 0 1 0
0 0 1 0 1
0 0 0 1 0
測資 03:Euler 迴路 (所有點度數皆為偶數,應輸出 YES)
1 2
2 3
3 1
預期輸出
YES
0 1 1
1 0 1
1 1 0
測資 04:無法一筆畫 (奇數度數超過 2 個,應輸出 NO)
6 5
1 2
2 3
3 4
4 5
5 6
預期輸出
NO
0 1 0 0 0 0
1 0 1 0 0 0
0 1 0 1 0 0
0 0 1 0 1 0
0 0 0 1 0 1
0 0 0 0 1 0
這 5 組測資涵蓋 Euler 迴路、Euler 路徑及無法一筆畫的情況 |