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

文章作者: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

好吧,先这样了。

 

posted on 2010-03-03 22:24  Ktyanny Home  阅读(472)  评论(0编辑  收藏  举报

导航