拓扑排序的简单实现

来源:互联网 发布:视频剪辑软件哪个好 编辑:程序博客网 时间:2024/05/21 21:43
拓扑排序就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面

算法流程
记录图中各个点的入度,每次选取度为0的点,然后更新删除与他相邻的边,即度数减1.
1.如果没有度为0的点,说明存在圈
2.有多个说明没有确定的序列,但不影响拓扑排序

3.重边没有影响,因为度也随之增加。

int n,m;vector<int> g[105];int topo[105];int in[105];int toposort(){int degree[105];// 返回 1 表示有确定拓扑序  -1表示存在圈  0 表示没有确定拓扑序// in为各个结点的入度,topo为序列,int flag=1;for(int i=1;i<=n;i++) degree[i]=in[i];for(int i=1;i<=n;i++){int cnt=0,u=0;for(int j=1;j<=n;j++) if(degree[j]==0) cnt++,u=j;if(cnt==0)  return -1;if(cnt>1) flag=0;degree[u]--;topo[i]=u;for(int j=0;j<(int)g[u].size();j++)degree[g[u][j]]--; }return flag;}


小试牛刀

uva 10305

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <vector>#include <map>#include <cmath>#include <set>#include <queue>using namespace std;const int INF=1e9+10;const double EPS = 1e-10;  typedef long long ll;int n,m;vector<int> g[105];int topo[105];int in[105];int toposort(){int degree[105];// 1 表示有确定拓扑序  -1表示存在圈  0 表示没有确定拓扑序// in为各个结点的入度,topo为序列,int flag=1;for(int i=1;i<=n;i++) degree[i]=in[i];for(int i=1;i<=n;i++){int cnt=0,u=0;for(int j=1;j<=n;j++) if(degree[j]==0) cnt++,u=j;if(cnt==0)  return -1;if(cnt>1) flag=0;degree[u]--;topo[i]=u;for(int j=0;j<(int)g[u].size();j++)degree[g[u][j]]--; }return flag;} int main(){//freopen("out.txt","w",stdout);while(scanf("%d %d",&n,&m)&&n+m){memset(in,0,sizeof(in));for(int i=1;i<=n;i++)g[i].clear();for(int i=0;i<m;i++){int u,v;scanf("%d %d",&u,&v);in[v]++;g[u].push_back(v);}toposort();for(int i=1;i<=n;i++)printf("%d%c",topo[i],i==n?'\n':' ');}    return 0;  }



0 0
原创粉丝点击