zoukankan      html  css  js  c++  java
  • 数据结构——图的简单应用

    #include<iostream>
    using namespace std;
    #define inf 32767
    #define maxv 10
    typedef char elem;
    typedef struct MGraph{
    elem vexes[maxv];
    int edges[maxv][maxv];
    int n,e;
    }mgraph;

    void initial(mgraph& g)
    {
    int i,j;
    g.e=0;
    g.n=0;
    for(j=0;j<maxv;j++)
    g.vexes[j]=0;
    for(i=0;i<maxv;i++)
    for(j=0;j<maxv;j++)
    g.edges[i][j]=inf;
    }


    int locate(mgraph g,elem u)
    {
    for(int i=0;i<g.n;i++)
    {
    if(g.vexes[i]==u)
    return i;
    }
    return -1;
    }
    void create(mgraph& g)
    {
    int i,j,k,w;
    elem u,v;
    printf("请输入有向图的顶点数:");
    scanf("%d",&g.n);
    printf("请输入有向图的弧数:");
    scanf("%d",&g.e);
    fflush(stdin);
    printf("请输入字符型顶点数据,如ABCD:");
    for(j=0;j<g.n;j++)
    scanf("%C",&g.vexes[j]);
    fflush(stdin);
    printf("请输入弧的信息,格式:弧尾,弧头,权值 ");
    for(k=0;k<g.e;k++)
    {
    scanf("%c,%c,%d",&u,&v,&w);
    i=locate(g,u);
    j=locate(g,v);
    g.edges[i][j]=w;
    fflush(stdin);
    }

    }

    void printg(mgraph g)
    {
    int i,j;
    printf("输入图的邻接矩阵存储信息: ");
    printf("顶点数据: ");
    for(i=0;i<g.n;i++)
    printf("%d:%c ",i,g.vexes[i]);
    printf("邻接矩阵数据: ");
    for(i=0;i<g.n;i++)
    {
    for(j=0;j<g.n;j++)
    if(g.edges[i][j]==inf)
    printf("无穷");
    else
    printf("%3d",g.edges[i][j]);
    printf(" ");
    }
    }


    int dist[maxv];
    int path[maxv];
    bool s[maxv];
    void dijkstra(mgraph g,int v)
    {
    int mindis,i,j,u;
    for(i=0;i<g.n;i++)
    {
    dist[i]=g.edges[v][i];
    s[i]=false;
    if(g.edges[v][i]<inf)
    path[i]=v;
    else
    path[i]=-1;
    }
    s[v]=true;
    path[v]=0;
    for(i=0;i<g.n;i++)
    {
    mindis=inf;
    u=-1;
    for(j=0;j<g.n;j++)
    if((s[j]==false)&&(dist[j]<mindis))
    {
    u=j;
    mindis=dist[j];
    }
    if(mindis<inf)
    {
    s[u]=true;
    for(j=0;j<g.n;j++)
    if(s[j]==false)

    if(g.edges[u][j]<inf&&dist[u]+g.edges[u][j]<dist[j])
    {
    dist[j]=dist[u]+g.edges[u][j];
    path[j]=u;
    }
    }
    }
    }


    void printpath(mgraph g,int v)
    {
    int i,j,w;
    int road[maxv];
    printf("%c到其他各顶点有没有找到最短路径: ",g.vexes[v]);
    for(i=0;i<g.n;i++)
    if(s[i])
    printf("%d:有 ",i);
    else
    printf("%d:无 ",i);
    printf(" ");
    for(i=0;i<g.n;i++)
    if((s[i]==true)&&(i!=v))
    {
    printf("从%c到%c的最短路径长度为:%d 路径为:",g.vexes[v],g.vexes[i],dist[i]);
    printf("%c->",g.vexes[v]);
    w=path[i];
    j=0;
    while(w!=v)
    {
    road[j]=w;
    j++;
    w=path[w];
    }
    for(j--;j>=0;j--)
    {
    printf("%c->",g.vexes[road[j]]);
    road[j]=-1;
    }
    printf("%c ",g.vexes[i]);
    }
    else
    printf("从%c到%c不存在路径 ",g.vexes[v],g.vexes[i]);
    }


    void main()
    {
    elem v0;
    int v;
    mgraph g;
    printf("1.初始化函数测试: ");
    initial(g);
    printf("2.创建函数测试: ");
    create(g);
    printf("3.输出函数测试: ");
    printg(g);
    printf("4.求最短路径: ");
    printf("请输出源顶点数据v0:");
    scanf("%c",&v0);
    v=locate(g,v0);
    dijkstra(g,v);
    printf("5.输出最短路径: ");
    printpath(g,v);
    printf(" ");
    }

  • 相关阅读:
    数组的应用:一。冒泡排序二。折半查找!二维数组的学习。
    break与continue,while 循环和一维数组的学习及作业
    for循环的应用:迭代法和穷举法
    循环
    称体重
    js js弹出框、对话框、提示框、弹窗总结
    windows 服务器开设端口
    SQL Server 数据库分离与附加(图文教程)
    ASP.NET MVC5 PagedList分页示例
    mvc 连接数据库但单复值得问题
  • 原文地址:https://www.cnblogs.com/lklk/p/9134702.html
Copyright © 2011-2022 走看看