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
鄰接矩陣初始化:
使用二維 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),主要是由於儲存鄰接矩陣的空間。
總結:
該程式能夠正確處理鄰接矩陣的生成,確保在遇到錯誤的輸入時能進行適當的錯誤提示,並且能夠高效地處理正常的輸入資料