标题:[讨论]图搜索+拓扑排序...
只看楼主
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
结帖率:33.33%
 问题点数:0 回复次数:17 
[讨论]图搜索+拓扑排序...
用C接口我也来模拟一下OO....和DevC++通过..
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http:// **
*****************************************************************/
#include<vector>
#include<queue>
#include<stack>
#include<iostream>

namespace graph
{
int gtime=0;  //  时间戳
enum COLOR { white, gray, black };  // 用于边的分类

template<typename _Ty>  // 顶点结构
struct vertex
{
   
_Ty name;
    int value;
    int d;
    int time;
    vertex* parent,*next;
    COLOR color;
};

template<typename _Ty>
int getValue(vector<vertex<_Ty> >& g,_Ty ch)  //  返回把顶点名字的映射到向量的值
{
   
for(int i=0;i<static_cast<int>(g.size());++i)
        if( g[i].name == ch) return g[i].value;
    return -1;
}

template<typename _Ty>
void createGraph(vector<vertex<_Ty> >& g,const int size_)  //  创建一个图
{
   
std::cout<<"please input the name of vertex: \n";
    for(int i=0;i<size_;++i)
    {
        
vertex<_Ty> vtex;
        std::cin>>vtex.name;
        vtex.d=vtex.time=0;
        vtex.next = vtex.parent=0;
        vtex.color = white;
        vtex.value = i;
        g.push_back(vtex);
    }
}

template<typename _Ty>      
void addedge(vector<vertex<_Ty> >& g,const _Ty v,const _Ty u)  //  用于添有无向边
{
   
int u_t=getValue(g,u),v_t=getValue(g,v);
    if(u_t!=-1&&v_t!=-1)
    {
   
vertex<_Ty>* vtex=new vertex<_Ty>;
    vtex->d=vtex->time=0;
    vtex->parent =0;
    vtex->color = white;
    vtex->value = u_t;
    vtex->next = g[v_t].next;
    g[v_t].next = vtex;
    }
}              

template<typename _Ty>
void waddedge(vector<vertex<_Ty> >& g,const _Ty v,const _Ty u)  //  用于添加无向边
{
   
addedge(g,v,u);
    addedge(g,u,v);
}

template<typename _Ty>
void bfs(vector<vertex<_Ty> >& g,const _Ty s)  // 广度优先搜索
{
   
std::queue<vertex<_Ty>*> que;
    que.push(&g[s]);
    g[s].color=gray;
    for(vertex<_Ty>* u ; !que.empty(); )
    {
        
u = que.front();
        que.pop();
        for(vertex<_Ty>* check=g[u->value].next;check;check=check->next)
            if(g[check->value].color ==white)   
            {
               
g[check->value].color = gray;
                g[check->value].d = g[u->value].d+1;
                g[check->value].parent = &g[u->value];
                que.push(&g[check->value]);
            }
        
g[u->value].color = black;
    }
}

template<typename _Ty>
void dfsVisite(vector<vertex<_Ty> >& g,const vertex<_Ty>& v)  //深度优先搜索
{// 递归版
   
gtime+=1;
    g[v.value].d=gtime;
    g[v.value].color=gray;
    for(vertex<_Ty>* check=g[v.value].next;check;check=check->next)
        if(g[check->value].color==white)
        {
            
g[check->value].parent=&g[v.value];
            dfsVisite(g,g[check->value]);
        }
   
g[v.value].color=black;
    g[v.value].time=gtime=gtime+1;
}
template<typename _Ty>
void dfsVisite(vector<vertex<_Ty> >& g,const vertex<_Ty>& v,int)
{//用栈消递归版
   
std::stack<vertex<_Ty>*> stk;
    gtime+=1;
    g[v.value].d=gtime;
    g[v.value].color=gray;
    stk.push(&g[v.value]);
    for(vertex<_Ty>* out;!stk.empty(); )
    {
        
out=stk.top(),stk.pop();
        for(vertex<_Ty>* check=g[out->value].next;check;check=check->next)
            if(g[check->value].color==white)
        {
            
g[check->value].color=gray;
            g[check->value].d=gtime=gtime+1;
            g[check->value].parent=&g[out->value];
            stk.push(&g[out->value]);
            out=&g[check->value];
            check=g[out->value].next;
        }
        
g[out->value].color=black;
        g[out->value].time=gtime=gtime+1;
    }
}

template<typename _Ty>
void dfs(vector<vertex<_Ty> >& g)  //  深度搜索
{
   
for(int i=0;i<static_cast<int>(g.size());++i)
        if(g[i].color==white)
        dfsVisite(g,g[i]);
}
template<typename _Ty>
void dfs(vector<vertex<_Ty> >& g,int w)
{
   
for(int i=0;i<static_cast<int>(g.size());++i)
        if(g[i].color==white)
        dfsVisite(g,g[i],w);
}

        
template<typename _Ty>
void print(vector<vertex<_Ty> >& g)  //  输出图
{
   
for(int i=0;i<static_cast<int>(g.size());++i)
    std::cout<<g[i].name<<": "
               
<<g[i].d<<","<<g[i].time<<std::endl;  
}

template<typename _Ty>
void freeGraph(vector<vertex<_Ty> >& g)  //  释放图
{
   
if( !g.empty())
    {
        
for(int i=0;i<static_cast<int>(g.size());++i)
        for(vertex<_Ty>* v=g[i].next,*t;v;)
        {
            
t = v;
            v=v->next;
            delete t;
        }
            
g.clear();
    }
}
}
int main(int argc, char *argv[])
{
   
using graph::addedge;
    std::vector<graph::vertex<char> > v;
    std::cout<<"please input the size of graph: \n";
    int size_;
    std::cin>>size_;
    graph::createGraph(v,size_);
    std::cout<<"please input the number of edge: \n";
    std::cin>>size_;
    std::cout<<"please input edge which you want to link: \n";
    char chv,chu;
    for(int i=0;i<size_;++i)
    {
        
std::cin>>chv>>chu;
        addedge(v,chv,chu);
    }
   
graph::dfs(v);
    graph::print(v);
    graph::freeGraph(v);
    system("PAUSE");
    return EXIT_SUCCESS;
}


[[it] 本帖最后由 中学者 于 2008-5-31 17:22 编辑 [/it]]

[[it] 本帖最后由 中学者 于 2008-5-31 22:35 编辑 [/it]]
搜索更多相关主题的帖子: 搜索 学习 DevC 模拟 
2008-05-31 16:48
Loli
Rank: 1
来 自:飞燕算法群46520219
等 级:新手上路
帖 子:348
专家分:0
注 册:2008-5-27
得分:0 
仅仅是对产生的图进行DFS么?

" border="0" />[color=white]
2008-05-31 16:55
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
有DFS和BFS.....BFS没调用...DFS有递归和用栈消递归的版本..

[[it] 本帖最后由 中学者 于 2008-5-31 16:59 编辑 [/it]]

樱花大战,  有爱.
2008-05-31 16:58
Loli
Rank: 1
来 自:飞燕算法群46520219
等 级:新手上路
帖 子:348
专家分:0
注 册:2008-5-27
得分:0 
哦哦。。。看到了,不错~~~~~~~

" border="0" />[color=white]
2008-05-31 17:10
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
图的深度搜索和广度搜索也是很经典的算法。。转化为邻接和拓扑图。。然后用栈解决。。很不错了。。找关键路径。。一直断线。。趁机发帖子。。吃饭去了

学习需要安静。。海盗要重新来过。。
2008-05-31 17:19
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
还有什么拓扑排序的算法??....
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http:// **
*****************************************************************/
template<typename _Ty>
void topologicalSort(std::vector<vertex<_Ty> >& g,std::list<int>& List)
{// 调用非递归版的深搜
   
dfs(g,0);
    std::vector<int> map(2*static_cast<int>(g.size())+1);
    for(int i=0,size_=static_cast<int>(g.size());i<size_;++i)
        map[g[i].time] = g[i].time;
    for(int i=0,size_=2*static_cast<int>(g.size())+1;i<size_;++i)
        if(map[size_-1-i]!=0) List.push_back(map[size_-1-i]);
}

template<typename _Ty>
void dfsVisite(vector<vertex<_Ty> >& g,const vertex<_Ty>& v,std::list<int>& List)
{
   
gtime+=1;
    g[v.value].d=gtime;
    g[v.value].color=gray;
    for(vertex<_Ty>* check=g[v.value].next;check;check=check->next)
        if(g[check->value].color==white)
        {
            
g[check->value].parent=&g[v.value];
            dfsVisite(g,g[check->value],List);
        }
   
g[v.value].color=black;
    g[v.value].time=gtime=gtime+1;
    List.push_front(gtime);
}
template<typename _Ty>
void topologicalSort(std::vector<vertex<_Ty> >&g,std::list<int>& List,int)
{
   
for(int i=0;i<static_cast<int>(g.size());++i)
        if(g[i].color==white)
        dfsVisite(g,g[i],List);
}

樱花大战,  有爱.
2008-05-31 22:36
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
时间戳好像是网络安全的概念。。中学这个地方用这个做什么?

学习需要安静。。海盗要重新来过。。
2008-05-31 22:47
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
用来记录发现时和搜索完成时的时间...

樱花大战,  有爱.
2008-05-31 22:57
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
呵呵。。我还以为你来做什么网络安全模型呢。。防止重放攻击呢。。

学习需要安静。。海盗要重新来过。。
2008-05-31 22:59
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
...........LS厉害,我网络什么都不懂....

樱花大战,  有爱.
2008-05-31 23:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-216889-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081551 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved