11.19

为啥不懂就问發表於2024-11-19

C++ 程式碼實現:
cpp

include

include

include <unordered_map>

using namespace std;

int main() {
int V, E;
cin >> V >> E;

// 錯誤處理:頂點個數為0
if (V == 0) {
    cout << "error" << endl;
    return 0;
}

// 錯誤處理:頂點個數為1,且邊個數大於0
if (V == 1 && E > 0) {
    cout << "error" << endl;
    return 0;
}

vector<char> vertices(V);
unordered_map<char, int> vertex_index;

// 讀取頂點並建立頂點到索引的對映
for (int i = 0; i < V; ++i) {
    cin >> vertices[i];
    vertex_index[vertices[i]] = i;
}

// 初始化鄰接矩陣
vector<vector<int>> adjMatrix(V, vector<int>(V, 0));

// 處理每條邊
for (int i = 0; i < E; ++i) {
    char u, v;
    cin >> u >> v;

    // 將邊 u -> v 設為 1
    adjMatrix[vertex_index[u]][vertex_index[v]] = 1;
}

// 輸出鄰接矩陣
for (int i = 0; i < V; ++i) {
    for (int j = 0; j < V; ++j) {
        cout << adjMatrix[i][j] << " ";
    }
    cout << endl;
}

return 0;

}
程式碼解析:
輸入部分:

透過 cin 讀取輸入的頂點數 V 和邊數 E。
如果 V == 0,立即輸出 "error"。
如果 V == 1 且 E > 0,輸出 "error"。
使用 vector 儲存頂點,並透過 unordered_map<char, int> 將每個頂點與其索引關聯。
鄰接矩陣初始化:

使用二維 vector 初始化鄰接矩陣,所有元素預設值為 0,表示沒有邊。
處理每條邊:

對於每條邊 (u, v),透過 vertex_index 查詢頂點 u 和 v 的索引,然後在鄰接矩陣中對應的位置設定為 1。
輸出鄰接矩陣:

遍歷鄰接矩陣並列印。
輸入輸出示例:
輸入:
4 4
a b c d
a b
a c
c d
d a
輸出:
0 1 1 0
0 0 0 0
0 0 0 1
1 0 0 0
錯誤輸入示例:
輸入:
0 0
輸出:
error
輸入:
1 1
a
a a
輸出:
error
複雜度分析:
時間複雜度:O(V^2 + E),初始化鄰接矩陣的時間複雜度是 O(V^2),處理每條邊的時間複雜度是 O(1),因此總體時間複雜度為 O(V^2 + E)。
空間複雜度:O(V^2),主要是由於儲存鄰接矩陣的空間。
總結:
該程式能夠正確處理鄰接矩陣的生成,確保在遇到錯誤的輸入時能進行適當的錯誤提示,並且能夠高效地處理正常的輸入資料