C++ 拓扑排序
我有以下代码,但我无法实现它,因为我不知道如何使用DAG的顶点表示DAGC++ 拓扑排序,c++,graph-theory,C++,Graph Theory,我有以下代码,但我无法实现它,因为我不知道如何使用DAG的顶点表示DAG #include<iostream> #include "queue.h" #include "graph.h" #include "bool.h" using namespace std; void init(Queue *q) { q->first=0; q->last=queuesize-1; q->count=0; } void enqueue(Queue
#include<iostream>
#include "queue.h"
#include "graph.h"
#include "bool.h"
using namespace std;
void init(Queue *q)
{
q->first=0;
q->last=queuesize-1;
q->count=0;
}
void enqueue(Queue *q,int x)
{
if(q->count>=queuesize)
{
cout<<"queue overflow "<<endl;
}
else
{
q->last=(q->last+1)%queuesize;
q->q[q->last]=x;
q->count=q->count+1;
}
}
int dequeue(Queue *q)
int x;
if(q->count<=0)
{
cout<<" empthy "<<endl;
}
else
{
x=q->q[q->first];
q->first=(q->first+1)%queuesize;
q->count=q->count-1;
}
return x;
}
int empthy_queue (Queue *q)
{
if(q->count<=0)
{
return TRUE;
}
return FALSE;
}
void initialize (graph *g)
{
int i;
g->nvertices=0;
g->nedges=0;
for(i=1; i<=maxv; i++)
{
g->degree[i]=0;
}
}
void insert(graph *g,int x,int y,boolean directed)
{
if(g->degree[x]>maxdegree)
{
cout<<"degree overflow";
}
g->edges[x][g->degree[x]]=y;
g->degree[x]++;
if(directed==FALSE)
{
insert(g,y,x,TRUE);
}
else
{
g->nedges++;
}
}
void read_graph(graph *g,boolean directed)
{
int i;
int m;
int x,y;
initialize(g);
cin>>g->nvertices>>m;
for(i=1; i<=m; i++)
{
cin>>x>>y;
insert(g,x,y,directed);
}
}
void cpmpute_degree(graph *g,int in[])
{
int i,j;
for(i=1; i<=g->nvertices; i++)
{
in[i]=0;
}
for(i=1; i<=g->nvertices; i++)
for(j=0; j<g->degree[i]; j++)
{
in[g->edges[i][j]]++;
}
}
void topsort(graph *g,int sorted[])
{
int indegree[maxv];
int x,y;
Queue zeroin;
int i,j;
cpmpute_degree(g,indegree);
init(&zeroin);
for(i=1; i<=g->nvertices; i++)
if(indegree[i]==0)
{
enqueue(&zeroin,i);
}
j=0;
while(empthy_queue(&zeroin)==FALSE)
{
j=j+1;
x=dequeue(&zeroin);
sorted[j]=x;
for(i=0; i<g->degree[x]; i++)
{
y=g->edges[x][i];
indegree[y]--;
if(indegree[y]==0)
{
enqueue(&zeroin,y);
}
}
}
if(j!=g->nvertices)
{
printf("Not a DAG -- only %d vertices found\n",j);
}
}
int main()
{
graph g;
int out[maxv];
int i;
read_graph(&g,false);
topsort(&g,out);
for(i=1; i<=g.nvertices; i++)
{
cout<<out[i]<<" ";
}
return 0;
}
等等。
假设顶点为6,边为8。
请帮助我,当我进入图形几次,它写了这个输出
printf("Not a DAG -- only %d vertices found\n",j);
请为图形(顶点6,边8)提供正确的输入。您可以通过研究您的
read\u graph
函数推断正确的输入格式:
void read_graph(graph *g,boolean directed){
int i;
int m;
int x,y;
initialize(g);
cin>>g->nvertices>>m;
for(i=1;i<=m;i++){
cin>>x>>y;
insert(g,x,y,directed);
}
我不知道你到底是什么意思 您的意思是在尝试拓扑排序之前检查它是否确实是DAG吗?拓扑排序的诀窍是,如果有一个循环,它会自动失败。因此,拓扑排序本身就是对DAGness的测试(我认为没有更简单的测试)。因此,与其首先测试图形是否是DAG,不如尝试对其进行拓扑排序。如果你成功了,它是一个DAG,你就完成了如果你失败了,它不是DAG,你可以告诉用户,也就是说,你也完成了 或者,您是否需要一个可能的输入文件来描述DAG(以便您可以在DAG上测试代码) 如果我正确理解您的输入格式,则以下内容应为其中之一:
6 8
1 2
1 3
2 3
2 5
3 6
4 5
4 6
5 6
它应描述以下图表:
1 ------> 2 -----
\ | \
\ | V
\ | 4 -> 5
\ | \ |
\ V V V
---> 3 ----> 6
(我希望你能理解我的ASCII艺术)啊,你有一个模糊描述的问题,一大堆格式不好的代码:让我来帮你吧!如果您展示一个实际的、特定的输入来产生输出,解释您认为它是错误的原因,以及您到目前为止所做的工作,也许会有所帮助。假设输入是这样的1-2-3-4-5-6-7-1(7个顶点,7个边),那么确实没有理由将
图形实例作为指针传递。因此,您的问题是:如果用户输入一个包含循环的有向图,您如何将其存储为有向无环图?嗯,除非你打破循环,否则你不能。不,我有问题如何传递DAG,这样就不应该有循环。请帮助我这些图形是否是DAG取决于用户传入的内容。如果他给你一个循环图,你对此无能为力。是的,但我的问题是如何用我的x点和y点表示DAG图,这样就不会产生循环,请给我举个例子,graphWikipedia关于拓扑排序的文章有一个简单的DAG,你可以用它作为例子。如果对节点重新编号,使其从1到8,则边看起来如下:1-4、1-5、2-4、3-5、3-8、4-6、4-7、4-8、5-7。您给出的原始示例不起作用的原因是它不是非循环的-从节点1开始,您可以遍历节点并返回节点1。
6 8
1 2
1 3
2 3
2 5
3 6
4 5
4 6
5 6
1 ------> 2 -----
\ | \
\ | V
\ | 4 -> 5
\ | \ |
\ V V V
---> 3 ----> 6