拓扑排序(模板)

来源:互联网 发布:centos 7 ftp服务器 编辑:程序博客网 时间:2024/05/17 23:12

第一种模板(使用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}}}


原创粉丝点击