数据结构—图的存储结构(邻接矩阵)

来源:互联网 发布:mysql in 值少会索引 编辑:程序博客网 时间:2024/05/17 23:02

邻接矩阵的代码
有向图/无向图

#include<iostream>#include<string>using namespace std;#define MAX_VERTEX_NUM 20#define INF 0typedef struct{    string vexs[MAX_VERTEX_NUM];//顶点数组.记录顶点的信息    int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵    int vexnum,arcnum;//顶点个数,边的条数}Graph;int create_graph(Graph &G){    int i,j;    //输入顶点个数和边的条数    cout<<"输入顶点个数:"<<endl;    cin>>G.vexnum;    cout<<"输入边的条数:"<<endl;    cin>>G.arcnum;    //将顶点信息保存起来    cout<<"逐行输入图的起始点和终端点:"<<endl;    for(i=0;i<G.vexnum;i++)    {        cin>>G.vexs[i];    }    //初始化邻接矩阵,将每条与边相关的信息都设置为INF    for(i=0;i<G.vexnum;i++)    {        for(j=0;j<G.vexnum;j++)        {            G.arc[i][j]=INF;        }    }    return 1;}int locate(Graph G,string v){    int i;    for(i=0;i<G.arcnum;i++)    {        if(v==G.vexs[i])        return i;    }    return -1;}//此处存入的是有向图int deposit(Graph &G){    string v1,v2;    int m,n;    cout<<"请输入您要存储的顶点信息:"<<endl;    for(int i=0;i<G.arcnum;i++)    {        cin>>v1>>v2;        m=locate(G,v1);        n=locate(G,v2);        G.arc[m][n]=1;        //若要存储无向图,由于无向图的邻接矩阵具        //有对称性,则只需在此处加上        //G.arc[n][m]=1;    }    return 1;}void display(Graph G){    cout<<"图的邻接矩阵显示如下:"<<endl;    for(int i=0;i<G.vexnum;i++)    {        for(int j=0;j<G.vexnum;j++)        {            cout<<G.arc[i][j]<<" ";        }        cout<<endl;    }}int main(){    Graph G;    //初始化矩阵    if(create_graph(G))    {        cout<<"初始化矩阵成功!"<<endl;    }    //向初始化矩阵中输入要存入的矩阵信息    if(deposit(G))    {        cout<<"向矩阵中存储信息成功!"<<endl;    }    //打印矩阵    display(G);    return 0;}

有向网/无向网

#include<iostream>#include<string>using namespace std;#define MAX_VERTEX_NUM 20#define INF 999typedef struct{    string vexs[MAX_VERTEX_NUM];//顶点数组.记录顶点的信息    int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵    int vexnum,arcnum;//顶点个数,边的条数}Graph;int create_graph(Graph &G){    int i,j;    //输入顶点个数和边的条数    cout<<"输入顶点个数:"<<endl;    cin>>G.vexnum;    cout<<"输入边的条数:"<<endl;    cin>>G.arcnum;    //将顶点信息保存起来    cout<<"请依次输入顶点信息:"<<endl;    for(i=0;i<G.vexnum;i++)    {        cin>>G.vexs[i];    }    //初始化邻接矩阵,将每条与边相关的信息都设置为INF    for(i=0;i<G.vexnum;i++)    {        for(j=0;j<G.vexnum;j++)        {            G.arc[i][j]=INF;        }    }    return 1;}int locate(Graph G,string v){    int i;    for(i=0;i<G.arcnum;i++)    {        if(v==G.vexs[i])        return i;    }    return -1;}//此处存入的是有向图int deposit(Graph &G){    string v1,v2;    int m,n;    int weight;    cout<<"请输入您要存储的顶点信息:"<<endl;    for(int i=0;i<G.arcnum;i++)    {        cin>>v1>>v2;        cin>>weight;        m=locate(G,v1);        n=locate(G,v2);        G.arc[m][n]=weight;        //若要改为无向网,则只需在此处再加上        //G.arc[n][m]=weight;    }    return 1;}void display(Graph G){    cout<<"图的邻接矩阵显示如下:"<<endl;    for(int i=0;i<G.vexnum;i++)    {        for(int j=0;j<G.vexnum;j++)        {            if(G.arc[i][j]==INF)                cout<<"∞";            else             cout<<G.arc[i][j]<<" ";        }        cout<<endl;    }}int main(){    Graph G;    //初始化矩阵    if(create_graph(G))    {        cout<<"初始化矩阵成功!"<<endl;    }    //向初始化矩阵中输入要存入的矩阵信息    if(deposit(G))    {        cout<<"向矩阵中存储信息成功!"<<endl;    }    //打印矩阵    display(G);    return 0;}

图和网的区别只在于边上有没有与边相关联的权值

0 0
原创粉丝点击