文章作者: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
好吧,先这样了。