关于拓扑排序的学习:
分享一个全面学习的网址 http://blog.youkuaiyun.com/dm_vincent/article/details/7714519
本文主要是整理模板以及使用过程中遇到的问题
邻接表建立拓扑排序模板:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100001
int n, m;//m是边,n是点
int indegree[maxn] = {0};
vector<int> v[maxn];
set<int> s;
int ans[maxn];
void readin()
{
int i,j;
scanf("%d%d",&n,&m );
for (i=1;i<=n;i++)
v[i].clear();
while(m--){
scanf("%d%d",&i,&j);//输入边;
v[i].push_back(j);//存入邻接表
indegree[j]++;//入度增加
}
}
int toposort()
{
int i,pos=0;
s.clear();//set容器清空
for ( i = 1; i <= n; i++ )
if ( indegree[ i ] == 0 )
s.insert( i );
while (!s.empty())
{
i = *s.begin();//取出容器中出度为0的点
ans[++pos]=i;//存入到topo答案数组中
s.erase(s.begin());//释放掉
while (!v[ i ].empty())//将以i为开头的邻接表中的节点全部都删掉
{
if ( --indegree[ v[ i ].back() ]==0 )
s.insert( v[ i ].back() );
v[i].pop_back();
}
}
if (pos==n)//如果topo中的点的数量为n则成立
return 1;
else//否则存在回路短路之类的
return 0;
}
int main()
{
int T,i;
scanf( "%d", &T );
while ( T-- )
{
readin();
toposort();
for (i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
}
return 0;
}
使用过程中遇到的问题:
邻接矩阵建立拓扑排序模板:
使用过程中遇到的问题: