poj1094貼一份TLE的程式碼,以後有可能再優化。
阿新 • • 發佈:2019-02-01
//poj1094 寫了兩個DFS,TLE 話說我輸入一次它就來兩個DFS,能不TLE嗎?
//我看Discuss有測試資料,跑了一下,真的很慢,腦殘的孩子果然只有慢慢學。
//貼一份TLE的程式碼,備份一下,說不定哪天我可以繼續優化,然後AC。
#include <iostream> #include <algorithm> #include <string> using namespace std; int top = 0; bool isSource[31]; bool isCircle; bool isComplete; int list[31][31]; int child[31]; bool mark[31]; int stack[1000000]; bool tempMark[31]; bool allMark(int n) { for (int i = 0; i < n; i++) { if (!mark[i]) return false; } return true; } bool dfs() { for (int i = 0; i < child[stack[top - 1]]; i++) { if (mark[list[stack[top - 1]][i]]) return true; else { mark[list[stack[top - 1]][i]] = true; tempMark[list[stack[top - 1]][i]]; stack[top++] = list[stack[top - 1]][i]; if (dfs()) return true; } } mark[stack[top - 1]] = false; top--; if (top == 0) return false; return false; } bool dfs2(int n) { if (allMark(n)) return true; for (int i = 0; i < child[stack[top - 1]]; i++) { if (!mark[list[stack[top - 1]][i]]) { mark[list[stack[top - 1]][i]] = true; tempMark[list[stack[top - 1]][i]] = true; stack[top++] = list[stack[top - 1]][i]; if (dfs2(n)) return true; } } mark[stack[top - 1]] = false; top--; if (top == 0) return false; return false; } void checkIsCircle(int n) { memset(tempMark, 0, sizeof(tempMark)); for (int i = 0; i < n; i++) { if (tempMark[i]) continue; top = 0; memset(mark, 0, sizeof(mark)); stack[top++] = i; mark[i] = true; tempMark[i] = true; if (dfs()) { isCircle = true; return; } } } void checkIsComplete(int n) { memset(tempMark, 0, sizeof(tempMark)); for (int i = 0; i < n; i++) { if (isSource[i] && !tempMark[i]) { top = 0; memset(mark, 0, sizeof(mark)); stack[top++] = i; mark[i] = true; tempMark[i] = true; if (dfs2(n)) { isComplete = true; return; } } } } int main() { int n, m; cin >> n >> m; while (n && m) { isCircle = false; isComplete = false; bool ok = false; for (int i = 0; i < n; i++) { isSource[i] = true; mark[i] = false; child[i] = 0; for (int j = 0; j < n; j++) list[i][j] = 0; } for (int i = 0; i < m; i++) { char s, c, t; cin >> s >> c >> t; int st = s - 'A'; int ed = t - 'A'; if (c == '<') { list[st][child[st]++] = ed; isSource[ed] = false; } else { list[ed][child[ed]++] = st; isSource[st] = false; } //對於是有向圖的起點的,採用遍歷看是否有環,然後看是否完整。 checkIsCircle(n); if (isCircle && !ok) { cout << "Inconsistency found after " << i + 1 << " relations." << endl; ok = true; } else { checkIsComplete(n); if (isComplete && !ok) { cout << "Sorted sequence determined after " << i + 1 << " relations: "; for (int i = 0; i < top; i++) cout << char('A' + stack[i]); cout << "." << endl; ok = true; } } } if (!isCircle && !isComplete) cout << "Sorted sequence cannot be determined." << endl; cin >> n >> m; } return 0; }