Graph——bfs,dfs

来源:互联网 发布:vb基础代码 编辑:程序博客网 时间:2024/06/03 16:59

做个记录:

BFS——queue实现

#include<iostream>#include<cstring>#include<queue>using namespace std;#define N 100struct Graph{    int vexnum;    int arcnum;    char vexs[N];    int arcs[N][N]; };int Loc_vexs(Graph G, char a){    for(int i=1;i<=G.vexnum;i++)    {        if(G.vexs[i] == a)        {            return i;        }    }   }void Input(Graph &G){    cin>>G.vexnum;    cin>>G.arcnum;    for(int i=1;i<=G.vexnum;i++)    {        cin>>G.vexs[i];    }    for(int i=1;i<=G.vexnum;i++)    {        for(int j=1;j<=G.vexnum;j++)        {            G.arcs[i][j] = 0;        }    }    for(int i=1;i<=G.arcnum;i++)    {        char a,b;        cin>>a>>b;        int x = Loc_vexs(G,a);        int y = Loc_vexs(G,b);        G.arcs[x][y] = 1;    }}void Bfs(Graph G){    int v[N];    memset(v,0,sizeof(v));    queue<int> q;    q.push(1);    v[1] = 1;    cout<<G.vexs[1]<<" ";    while(!q.empty())    {        int u = q.front();        for(int i=1;i<=G.vexnum;i++)        {            if(!v[i] && G.arcs[u][i]==1)            {                cout<<G.vexs[i]<<" ";                v[i] = 1;                q.push(i);            }        }        q.pop();    }    cout<<endl;}int main(){    Graph G;    Input(G);    Bfs(G);    return 0;}

bfs递归还未实现

DFS——stack实现

#include<iostream>#include<cstring>#include<stack>using namespace std;#define N 100struct Graph{    int vexnum;    int arcnum;    char vexs[N];    int arcs[N][N]; };int Loc_vexs(Graph G, char a){    for(int i=1;i<=G.vexnum;i++)    {        if(G.vexs[i] == a)        {            return i;        }    }   }void Input(Graph &G){    cin>>G.vexnum;    cin>>G.arcnum;    for(int i=1;i<=G.vexnum;i++)    {        cin>>G.vexs[i];    }    for(int i=1;i<=G.vexnum;i++)    {        for(int j=1;j<=G.vexnum;j++)        {            G.arcs[i][j] = 0;        }    }    for(int i=1;i<=G.arcnum;i++)    {        char a,b;        cin>>a>>b;        int x = Loc_vexs(G,a);        int y = Loc_vexs(G,b);        G.arcs[x][y] = 1;    }}void Dfs(Graph G){    int v[N];    memset(v,0,sizeof(v));    stack<int> s;    s.push(1);    v[1] = 1;    cout<<G.vexs[1]<<" ";    while(!s.empty())    {        int u = s.top();        int flag = 0;        for(int i=1;i<=G.vexnum;i++)        {            if(!v[i] && G.arcs[u][i]==1)            {                s.push(i);                cout<<G.vexs[i]<<" ";                v[i] = 1;                 flag = 1;                  break;  // 仅此于bfs不同            }        }        if(flag==0)  // 标记 u 此时为最深处 ,开始回溯         {            s.pop();        }    }}int main(){    Graph G;    Input(G);    Dfs(G);    return 0;}

DFS——递归实现

#include<iostream>#include<cstring>using namespace std;#define N 100struct Graph{    int vexnum;    int arcnum;    char vexs[N];    int arcs[N][N]; };int Loc_vexs(Graph G, char a){    for(int i=1;i<=G.vexnum;i++)    {        if(G.vexs[i] == a)        {            return i;        }    }   }void Input(Graph &G){    cin>>G.vexnum;    cin>>G.arcnum;    for(int i=1;i<=G.vexnum;i++)    {        cin>>G.vexs[i];    }    for(int i=1;i<=G.vexnum;i++)    {        for(int j=1;j<=G.vexnum;j++)        {            G.arcs[i][j] = 0;        }    }    for(int i=1;i<=G.arcnum;i++)    {        char a,b;        cin>>a>>b;        int x = Loc_vexs(G,a);        int y = Loc_vexs(G,b);        G.arcs[x][y] = 1;    }}int v[N];void Dfs(Graph G,int x){    cout<<G.vexs[x]<<" ";    v[x] =1;    for(int i=1;i<=G.vexnum;i++)    {        if(!v[i] && G.arcs[x][i]==1)        {            Dfs(G,i);        }    }} int main(){    Graph G;    Input(G);    memset(v,0,sizeof(v));    Dfs(G,1);  // 假设从vexs[1] 开始     return 0;}
0 0
原创粉丝点击