图的有关操作

来源:互联网 发布:c 数组赋值 编辑:程序博客网 时间:2024/05/16 00:54

1.键盘输入数据,建立一个有向图的邻接表。

2.输出该邻接表。

3.在有向图的邻接表的基础上计算各顶点的度,并输出。

4.以有向图的邻接表为基础实现输出它的拓扑排序序列。

5.采用邻接表存储实现无向图的深度优先非递归遍历。

6.采用邻接表存储实现无向图的广度优先遍历。

7.在主函数中设计一个简单的菜单,分别调试上述算法。

#include <iostream>#include <vector>#include <string.h>#include <queue>#include <stack>using namespace std;const int N=1000;struct tu1{    vector<int>tu[N];    int n,m;    int rd[N],cd[N]; ///入度和出度    void input()    {        memset(rd,0,sizeof(rd));        memset(cd,0,sizeof(cd));        cout<<"请输入n个点m条边的有向图"<<endl;        cout<<"请输入n"<<endl;        cin>>n;        cout<<"请输入m"<<endl;        cin>>m;        int x=m;        while(x--)        {            int a,b;            cin>>a>>b;            tu[a].push_back(b);            rd[b]++;            cd[a]++;        }    }    void bianli()///遍历图    {        cout<<"该图的所有边为:"<<endl;        for(int i=1; i<=n; i++)        {            int l=tu[i].size();            for(int j=0; j<l; j++)                cout<<i<<"->"<<tu[i][j]<<endl;        }    }    void getdu()///得到各顶点的度    {        for(int i=1; i<=n; i++)            cout<<i<<"顶点的入度为"<<rd[i]<<"出度为"<<cd[i]<<endl;    }    void topu()///拓扑排序    {        queue<int>q;        for(int i=1; i<=n; i++)            if(rd[i]==0)                q.push(i);        cout<<"拓扑排序顺序是:"<<endl;        while(!q.empty())        {            int t=q.front();            cout<<t<<' ';            q.pop();            int l=tu[t].size();            for(int i=0; i<l; i++)            {                int to=tu[t][i];                rd[to]--;                if(rd[to]==0)                    q.push(to);            }        }        cout<<endl;    }};struct tu2{    vector<int>tu[N];    int n,m;    bool vis[N];    void input()    {        cout<<"请输入n个点m条边的无向图"<<endl;        cout<<"请输入n"<<endl;        cin>>n;        cout<<"请输入m"<<endl;        cin>>m;        int x=m;        while(x--)        {            int a,b;            cin>>a>>b;            tu[a].push_back(b);            tu[b].push_back(a);        }    }    void dfs()///非递归深搜    {        cout<<"非递归深搜序列为:"<<endl;        memset(vis,0,sizeof(vis));        stack<int>s;        s.push(1);        while(!s.empty())        {            int t=s.top();            cout<<t<<' ';            s.pop();            vis[t]=1;            int l=tu[t].size();            for(int i=0; i<l; i++)            {                int to=tu[t][i];                if(!vis[to])                    vis[to]=1,s.push(to);            }        }        cout<<endl;    }    void bfs()///广搜    {        cout<<"广搜序列为:"<<endl;        memset(vis,0,sizeof(vis));        queue<int>q;        q.push(1);        while(!q.empty())        {            int t=q.front();            cout<<t<<' ';            q.pop();            vis[t]=1;            int l=tu[t].size();            for(int i=0; i<l; i++)            {                int to=tu[t][i];                if(!vis[to])                    vis[to]=1,q.push(to);            }        }        cout<<endl;    }};int main(){    tu1 A;    A.input();    A.bianli();    A.getdu();    A.topu();    tu2 B;    B.input();    B.dfs();    B.bfs();    return 0;}


1 0
原创粉丝点击