您的位置:首页 > 其它

关于《算法概论》中,使用dfs对图进行标记的操作的实践

2018-01-05 20:42 183 查看
其实本身是在做leetcode 685. Redundant Connection II

题目说一定以根节点开头,但实际好像并非如此…感觉被坑了。

原先的思路是利用书中所说的dfs,选好根节点,进行pre和post标记,根据每个节点的标记判断前向边,横跨边,回边。

不过测试会出现第一个边是需要删除的边的情况。。。

就权当对bfs的边判断的练手了

class Solution {
public:
bool isBack(int preA, int postA, int preB, int postB) {
if (preB < preA && preA < postA && postA < postB) return true;
return false;
}
bool isCross(int preA, int postA, int preB, int postB) {
if (preB < postB && postB < preA && preA < postA) return true;
return false;
}
bool isForward(int preA, int postA, int preB, int postB) {
if (preA < preB && preB < postB && postB < postA) return true;
return false;
}
vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {
vector<vector<int>> graph;
vector<bool> visit;
int N = edges.size();
graph.resize(N+1);
visit.resize(N+1);
for (int i = 0; i < N+1; i++) visit[i] = false;
for (auto x: edges) {
graph[x[0]].push_back(x[1]);
}
//dfs
stack<int> s;
int tag = 0;
vector<int> pre;
vector<int> post;
pre.resize(N+1);
post.resize(N+1);
s.push(edges[0][0]);
visit[edges[0][0]] = true;
pre[edges[0][0]] = tag++;
while (!s.empty()) {
int cur = s.top();
//cout << cur << endl;
bool find = false;
for (int i = 0; i < graph[cur].size(); i++) {
if (!visit[graph[cur][i]]) {
s.push(graph[cur][i]);
visit[graph[cur][i]] = true;
pre[graph[cur][i]] = tag++;
find = true;
break;
}
}
if (!find) {
post[cur] = tag++;
s.pop();
}
}
vector<int> result;
for (int i = edges.size()-1; i >= 0; i--) {
if (isBack(pre[edges[i][0]], post[edges[i][0]], pre[edges[i][1]], post[edges[i][1]])||
isCross(pre[edges[i][0]], post[edges[i][0]], pre[edges[i][1]], post[edges[i][1]])) {
result.push_back(edges[i][0]);
result.push_back(edges[i][1]);
return result;
}
}
if (result.size() == 0) {
for (int i = edges.size()-1; i >= 0; i--) {
if (isForward(pre[edges[i][0]], post[edges[i][0]], pre[edges[i][1]], post[edges[i][1]])) {
result.push_back(edges[i][0]);
result.push_back(edges[i][1]);
return result;
}
}
}
return result;
}
};


注:该段代码并不能通过测试(开头不是根的情况无法通过)

但还是有意义的。利用bfs对各个节点定下标记:

通过pre标记和post标记的大小判断边的种类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐