第一种模板(使用dfs)
int n, G[maxn][maxn], c[maxn], topo[maxn], t;
/*
*n表示邻接表的个数,
*c[]表示状态,为1表示访问过,为0表示未访问,为-1表示正在访问
*topo表示排完序的拓扑序列
*/
bool dfs(int u){
c[u] = -1;
for(int v = 0; v < n; v++) if(G[u][v]) {
if(c[v]<0)
return false;
else if(!c[v])
dfs(v);
}
c[u] = 1; topo[--t]=u;
return true;
}
bool toposort(){
t = n;
memset(c, 0, sizeof(c));
for(int u = 0; u < n; u++) if(!c[u])
if(!dfs(u)) return false;
return true;
}
第二种模板(利用出度的想法,入度为0表示第一个放出图的点,同时所有和改点相连的点的入度减一)
int G[MAXN][MAXN];//路径
int in_degree[MAXN];//入度
int ans[MAXN];//路径
int n;//顶点
void toposort()
{
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(G[i][j])
{
in_degree[j]++;
}
}
}
for(i = 1; i <= n; i++)//从最小的开始寻找,
{//这样保证了有多个答案时序号小的先输出
int k = 1;
while(in_degree[k] != 0)//寻找入度为零的点
k++;
ans[i] = k;
in_degree[k] = -1;
//更新为-1,后边检测不受影响,相当于删除节点
for(int j = 1; j <= n; j++)
{
if(G[k][j])
in_degree[j]--;//相关联的入度减1
}
}
}