您的位置:首页 > 其它

hdu1285(拓扑排序)

2013-08-02 22:26 190 查看
拓扑排序简单来说就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。
拓扑排序最大的用途就是判断一个有向图是否有环,当然判断还有一种方法就是Floyd算法。
如果用邻接表的话拓扑排序的时间复杂度是O(N*E),邻接矩阵是O(N^2),N表示顶点数,E表示边数,Floyd时间复杂度是O(N^3)。
性质

1、 拓扑排序在有向无环图中才能排出有效的序列,否则能判断该有向图有环。

2、如果输入的有向图中的点,不存在入度为0的点,则该有向图存在回路

3、如果存在的入度为0的点大于一个,则该有向图肯定不存在一个可以确定的拓扑序列但并不妨碍拓扑排序

与一般的拓扑排序比,这个只多了一个存储名次的数组。。

#include<stdio.h>

#include<string.h>

int map[501][501];

int ans[501],degree[501];

int m,n;

void toposort()

{

int i,j,r;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(map[i][j]==1)

degree[j]++;//数组用来记录每个点的入度

for(i=1;i<=n;i++)

{

j=1;

while(degree[j]!=0)//从第一个节点开始找到一个节点入度为0的节点

j++;

ans[i]=j;//储答案

degree[j]--;//将该节点的入度更新为-1

for(r=1;r<=n;r++)

{

if(map[j][r]==1)//将所有与节点j相连的节点的入度值全部减1

degree[r]--;

}

}

}

int main()

{

int i,h,k;

while(scanf("%d%d",&n,&m)!=EOF)

{

memset(degree,0,sizeof(degree));

memset(map,0,sizeof(map));

for(i=0;i<m;i++)

{

scanf("%d%d",&k,&h);

map[k][h]=1;

}

toposort();

for(i=1;i<n;i++)

printf("%d ",ans[i]);

printf("%d\n",ans
);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: