拓扑排序(链表实现,未测试)

文章作者:ktyanny 文章来源:ktyanny 转载请注明,谢谢合作。     

  

  一直是在用邻接表,有时候想尝试用链表来处理图的算法,也许能够找到喜感。呵呵,今晚了解了这个心愿吧。

  话说好久没有努力学习了,但是我还是很努力去谈恋爱的^.^。年前年后,算算应该是有2个月左右没有碰了吧,现在赶紧努力起来。像老公说的那样,把之前的东西捡一捡,在没有把遗留下来的问题先解决掉,这样学起来也不会那么辛苦了。他还告诉我,如果你没有把你之前学过的知识忘掉,那么你就已经是一个天才了。好吧。不会让你担心失望的。

  贴上我今晚的学习结果吧。没有测试的版本:

  


#include 
<
iostream
>

#include 

<
stack
>

#include 

<
stdio.h
>


using
 
namespace
 std;


//
n 为图G的顶点个数


int
 n;


//
定义邻接表的结构,一个结构记录一条边


struct
 Edge
{
    

int
 dest; 
//
记录的地


    
int
 value; 
//
边的权值


    Edge
*
 next;
};


//
申请表空间


Edge
*
 edge 
=
 
new
 Edge[n];
//
在这里使用new,因为n是可变的


int
 i, u, v;


//
初始化邻接表


void
 init()
{
    

for
(
int
 i 
=
 
0
; i 
<
 n; i
++
)
        edge[i].next 

=
 NULL;
}


void
 read()
{
    Edge

*
 l;
    

//
接受输入,(u,v)代表一条边


    
int
 u, v;
    

while
(cin 
>>
 u 
>>
 v)
    {        
        l 

=
 
new
 Edge;    
//
 新建一个邻接表结构    


        l
->
dest 
=
 v;
//
填写目的地位顶点v
        

//
把新建的邻接表结构加入到顶点u的链表中去


        l
->
next 
=
 edge[u].next;
        edge[u].next 

=
 l;

        
//
如果是有向图的话,下面4句话可以省略


        l 
=
 
new
 Edge;
        l

->
dest 
=
 u;
        l

->
next 
=
 edge[v].next;
        edge[v].next 

=
 l;                
    }
}


int
 ret[
1005
];

int
 linktoposort()
{
    

//
统计每个顶点的入度数


    
int
*
 degree 
=
 
new
 
int
[n];
    memset(degree, 

0
, n
*
sizeof
(
int
));
    

int
 i;
    Edge

*
 l;
    

for
(
int
 i 
=
 
0
; i 
<
 n; i
++
)
    {
        l 

=
 edge[i].next;
        

while
(l)
        {
            degree[l

->
dest]
++
;
            l 

=
 l
->
next;
        }
    }
    stack

<
int
>
 s;
    

for
(
int
 i 
=
 
0
; i 
<
 n; i
++
)
    {
        

if
(degree[i] 
==
 
0
)
            s.push(i);
    }
    

int
 count 
=
 
0
;
    

int
 u;
    

while
(
!
s.empty())
    {
        u 

=
 s.top();
        s.pop();
        ret[count] 

=
 u;
        count

++
;
        
        l 

=
 edge[u].next;
        

while
(l)
        {
            degree[l

->
dest]

;
            

if
(l
->
dest 
==
 
0
)
                s.push(l

->
dest);
            l 

=
 l
->
next;
        }
    }
    

if
(count 
==
 n)
        

return
 
1
;
    

return
 
0
;
}


int
 main()
{
    init();
    read();
    linktoposort();
    

return
 
0
;
}

有空的话做一下:poj 1094 3267 3687 2367 3272

        HDoj 1285 

        zoj 1060 1083

好吧,先这样了。

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/ktyanny/archive/2010/03/03/1677631.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞