void dfsVisit(vector<vector<int> >&graph, int node, vector<int>&visit,
vector<int>&father)
{
int n = graph.size();
visit[node] = 1;//正在遍历状态
//cout<<node<<"-\n";
for(int i = 0; i < n; i++)
if(i != node/*防止寻找自己*/ && graph[node][i] != INT_MAX/*防止两节点之间无边*/)
{
if(visit[i] == 1 && i != father[node]/*无向图如果i是node的父节点则不是环*/)
//找到一个环
{
int tmp = node;
cout<<"cycle: ";
while(tmp != i)
{
cout<<tmp<<"->";
tmp = father[tmp];
}
cout<<tmp<<endl;
}
else if(visit[i] == 0)//未遍历过
{
father[i] = node;
dfsVisit(graph, i, visit, father);
}
}
visit[node] = 2;//已经遍历过
}
void dfs(vector<vector<int> >&graph)
{
int n = graph.size();
vector<int> visit(n, 0); //visit按照算法导论22.3节分为三种状态0,1,2
vector<int> father(n, -1);// father[i] 记录遍历过程中i的父节点
for(int i = 0; i < n; i++)
if(visit[i] == 0)
dfsVisit(graph, i, visit, father);
}
/*dfs拓扑*/
stack<int> tuopu;
void dfsVisit(vector<vector<int> >&graph, int node, vector<int>&visit,
vector<int>&father)
{
int n = graph.size();
visit[node] = 1;
//cout<<node<<"-\n";
for(int i = 0; i < n; i++)
if(i != node && graph[node][i] != INT_MAX)
{
if(visit[i] == 1 && i != father[node])//找到一个环
{
int tmp = node;
cout<<"cycle: ";
while(tmp != i)
{
cout<<tmp<<"->";
tmp = father[tmp];
}
cout<<tmp<<endl;
}
else if(visit[i] == 0)
{
father[i] = node;
dfsVisit(graph, i, visit, father);
}
}
visit[node] = 2;
tuopu.push(node);
}
void dfs(vector<vector<int> >&graph)
{
int n = graph.size();
vector<int> visit(n, 0); //visit按照算法导论22.3节分为三种状态
vector<int> father(n, -1);// father[i] 记录遍历过程中i的父节点
for(int i = 0; i < n; i++)
if(visit[i] == 0)
dfsVisit(graph, i, visit, father);
}
无向图判断是否有环并输出环
最新推荐文章于 2024-04-15 01:07:08 发布