筆試題,銀行賬戶之間轉賬
阿新 • • 發佈:2019-02-12
題目大意是這樣的,銀行裡面賬戶之間會互相轉賬,只有入賬而沒有出賬的賬戶被稱為安全賬戶,若另一個賬戶能夠通過轉賬路徑到達安全賬戶,那麼此賬戶也是安全賬戶。輸入m個賬戶,和n條轉賬關係,輸出安全賬戶的序號。
#include<iostream> #include<list> #include<iterator> #include<stack> using namespace std; int main() { int m, n; cin >> m >> n; int input[100][2]; int matrix[100][100]; for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) {matrix[i][j] = 0; } } for (int i = 1; i <=n;i++) { cin >> input[i][0] >> input[i][1]; matrix[input[i][0]][input[i][1]] = 1; } list<int> temp; for (int i = 1; i <= m; i++)//先找到只入不出的終節點 { int sum = 0; for (int j = 1; j <= m; j++) sum += matrix[i][j]; if (sum == 0) temp.push_back(i); } //stack<int> safety; for (int i = 1; i <= m; i++) { if (find(temp.begin(), temp.end(), i) != temp.end()) { continue; } else { int b[100] = { 0 }; b[i] = 1;//作為此條路徑上賬戶的標記 int index = input[i][1];//下一個賬戶 int q = 0; while (1) { if (b[index] == 1)//如果下一個賬戶已經出現過,跳出迴圈 { q = 1; break; } else b[index] = 1; if (find(temp.begin(), temp.end(), index) != temp.end()) { break; } else { index = input[index][1]; } } if (q == 1) break; temp.push_back(i); } } list<int>::iterator iter; for (iter=temp.begin(); iter!=temp.end(); iter++) { cout<<*iter << " "; } system("pause"); return 0; }