拓扑排序就是根据给出的集合上的偏序关系得到该集合上的一个全序。
进行拓扑排序可以根据入度求出:不断地选择入度为0的结点,并且删除该结点以及以该结点为起点的弧。如果在过程中所有的结点入度均大于0,则证明无法进行拓扑排序。
int n; //结点数
int m; //偏序数
void TopoSort()
{
memset(G,0,sizeof(G));
memset(in,0,sizeof(in));
int u,v;
for(int i=0; i<m; i++)
{
scanf("%d%d",&u,&v);
G[u][v] = 1;
in[v]++;
}
/*遍历一次,找出一个结点*/
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
if(!in[j])
{
printf("%d ",j);
in[j]--;
for(int k=1; j<=n ;k++)
if(G[j][k]) in[k]--;
break;
}
}
}
也可以直接利用dfs搜索。
bool dfs(int u)
{
c[u] = -1; //正在访问
for(int v=1; v<=n; v++)
if(G[u][v])
{
if(c[v]<0) return false;
if(!c[v] && !dfs(v)) return false;
}
c[u] = 1; //已经访问
topo[--t] = u; //逆序
return true;
}
bool toposort()
{
t = n;
for(int u=1; u<=n; u++)
if(!c[u])
if(!dfs(u)) return false;
return true;
}
bool dfs(int u)
{
c[u] = -1; //正在访问
for(int v=1; v<=n; v++)
if(G[u][v])
{
if(c[v]<0) return false;
if(!c[v] && !dfs(v)) return false;
}
c[u] = 1; //已经访问
topo[--t] = u; //逆序
return true;
}
bool toposort()
{
t = n;
for(int u=1; u<=n; u++)
if(!c[u])
if(!dfs(u)) return false;
return true;
}