直播短视频源码,邻接矩阵实现图的相关代码

简介: 直播短视频源码,邻接矩阵实现图的相关代码
/*
    Author:Albert Tesla Wizard
    Time:2020/10/26 20:22
*/
    #include<bits/stdc++.h>
#define OK 1
#define Infinity INT_MAX
#define Error -1
const int MAXSIZE=20;
using namespace std;
typedef enum{DG,UDG,DN,UDN}Graphtype;
typedef int TypeElement;
struct Graph
{
    int vertexnum;
    int arcnum;
    TypeElement arc[MAXSIZE][MAXSIZE];
    char vertex[MAXSIZE];
    Graphtype type;
};
//找到顶点v在图中的位置
int Locate(char v,Graph&G)
{
    for(int i=1;i<=G.vertexnum;i++)
    {
        if(v==G.vertex[i])return i;
    }
    return -1;
}
//创建图G
void create(Graph&G)
{
    cout<<"请输入图的类型:0.有向图 1.无向图 2.有向网 3.无向网"<<endl;
    int type,v1,v2;
    char c1,c2;
    cin>>type;
    if(type==DG)
    {
        G.type=DG;
    }
    else if(type==UDG)
    {
        G.type=UDG;
    }
    else if(type==DN)
    {
        G.type=DN;
    }
    else if(type==UDN)
    {
        G.type=UDN;
    }
    cout<<"请输入图的顶点数目:"<<endl;
    cin>>G.vertexnum;
    cout<<"请输入图的弧的数目:"<<endl;
    cin>>G.arcnum;
    cout<<"请输入各个顶点的值:"<<endl;
    for(int i=1;i<=G.vertexnum;i++)cin>>G.vertex[i];
    if(G.type==DG||G.type==UDG)
    {
        for(int i=1;i<=G.vertexnum;i++)
        for(int j=1;j<=G.vertexnum;j++)G.arc[i][j]=0;
    }
    else if(G.type==DN||G.type==UDN)
    {
        for(int i=1;i<=G.vertexnum;i++)
        for(int j=1;j<=G.vertexnum;j++)G.arc[i][j]=INT_MAX;
    }
    for(int i=1;i<=G.arcnum;i++)
    {
    cout<<"请输入各条弧的两个节点v1,v2:"<<endl;
    cin>>c1>>c2;
    v1=Locate(c1,G);
    v2=Locate(c2,G);
    if(G.type==DG)
    {
        G.arc[v1][v2]=1;
    }
    else if(G.type==UDG)
    {
        G.arc[v1][v2]=G.arc[v2][v1]=1;
    }
    else if(G.type==DN)
    {
        cout<<"请输入该边的权值:"<<endl;
        int weight;
        cin>>weight;
        G.arc[v1][v2]=weight;
    }
    else if(G.type==UDN)
    {
        cout<<"请输入该边的权值:"<<endl;
        int weight;
        cin>>weight;
        G.arc[v1][v2]=weight;
        G.arc[v2][v1]=G.arc[v1][v2];
    }
    }
}
void print(Graph&G)
{
    if(G.type==DG)cout<<"图的类型:有向图"<<endl;
    else if(G.type==UDG)cout<<"图的类型:无向图"<<endl;
    else if(G.type==DN)cout<<"图的类型:有向网"<<endl;
    else if(G.type==UDN)cout<<"图的类型:无向网"<<endl;
    cout<<"图的顶点数目:"<<G.vertexnum<<endl;
    cout<<"图的弧的数目:"<<G.arcnum<<endl;
    cout<<"图的顶点集合:";
    for(int i=1;i<=G.vertexnum;i++)cout<<G.vertex[i]<<" ";
    cout<<endl;
    cout<<"图的邻接矩阵:"<<endl;
    bool flag=true;
        for(int i=1;i<=G.vertexnum;i++)
    {
        for(int j=1;j<=G.vertexnum;j++)
        {
            if(flag){flag=false;cout<<G.arc[i][j];}
            else {cout<<setw(4)<<G.arc[i][j]<<" ";}
        }
        flag=true;
        cout<<endl;
    }
}
//根据顶点在图中的相对位置返回顶点的值
char GetVertex(int index,Graph&G)
{
    if(index<=G.vertexnum)return G.vertex[index];
}
//对顶点v重新赋值
int putVertex(char v,char v1,Graph&G)//v为图中原有的顶点值,v1为新的顶点值
{
        int k=Locate(v,G);
        if(k!=-1)
        {
            G.vertex[k]=v1;
        }
        return OK;
}
//找到顶点v的第一个邻接点
int firstadjacent(char v,Graph&G)
{
    if(G.type==DG||G.type==UDG)
    {
        int k=Locate(v,G);
            for(int j=1;j<=G.vertexnum;j++)
                if(G.arc[k][j]!=0)return j;

    }
    else if(G.type==DN||G.type==UDN)
    {
        int k=Locate(v,G);
            for(int j=1;j<=G.vertexnum;j++)
                if(G.arc[k][j]!=Infinity)return j;
    }
    return -1;
}
//w是v的邻接顶点,找到v相对于w的下一个邻接顶点
int nextadjacent(char v,char w,Graph&G)
{
   int k1=Locate(v,G);
   int k2=Locate(w,G);
   if(G.type==DG||G.type==UDG)
   {
   for(int j=k2+1;j<=G.vertexnum;j++)
   {
       if(G.arc[k1][j]!=0)return j;
   }
   }
   else if(G.type==DN||G.type==UDN)
   {
       for(int j=k2+1;j<=G.vertexnum;j++)
   {
       if(G.arc[k1][j]!=Infinity)return j;
   }
   }
   return -1;
}
//在图中插入一个新的顶点
int Insert(char v,Graph&G)
{
    G.vertex[G.vertexnum+1]=v;
    if(G.type==DG||G.type==UDG)
    {
        for(int i=1;i<=G.vertexnum+1;i++)
        {
            G.arc[i][G.vertexnum+1]=G.arc[G.vertexnum+1][i]=0;
        }
    }
    else if(G.type==DN||G.type==UDN)
    {
        for(int i=1;i<=G.vertexnum+1;i++)
        {
            G.arc[i][G.vertexnum+1]=G.arc[G.vertexnum+1][i]=Infinity;
        }
    }
    G.vertexnum+=1;
}
//在图中删除一个顶点及与它相关联的边
int Delete(char v,Graph&G)
{
    int k=Locate(v,G);
    if(k==-1)return Error;
    for(int i=1;i<=G.vertexnum-1;i++)G.vertex[i]=G.vertex[i+1];
    for(int i=1;i<=G.vertexnum;i++)
        for(int j=1;j<=G.vertexnum-1;j++)
        G.arc[i][j]=G.arc[i][j+1];
    for(int i=1;i<=G.vertexnum-1;i++)
        for(int j=1;j<=G.vertexnum;j++)
        G.arc[i][j]=G.arc[i+1][j];
    G.vertexnum--;
}
//在图中插入一条弧
int Insertarc(char v,char w,Graph&G)
{
    int k1=Locate(v,G);
    int k2=Locate(w,G);
    if(k1<0||k2<0)return Error;
    if(G.type==DG)
    {
        G.arc[k1][k2]=1;
    }
    else if(G.type==UDG)
    {
        G.arc[k1][k2]=G.arc[k2][k1]=1;
    }
    else if(G.type==DN)
    {
        int weight;
        cout<<"请输入该边的权值:"<<endl;
        cin>>weight;
        G.arc[k1][k2]=weight;
    }
    else if(G.type==UDN)
    {
        int weight;
        cout<<"请输入该边的权值:"<<endl;
        cin>>weight;
        G.arc[k1][k2]=G.arc[k2][k1]=weight;
    }
    G.arcnum++;
}
//在图中删除一条弧
int Deletearc(char v,char w,Graph&G)
{
    int k1=Locate(v,G);
    int k2=Locate(w,G);
    if(k1<0||k2<0)return Error;
    if(G.type==DG)
    {
        G.arc[k1][k2]=0;
    }
    else if(G.type==UDG)
    {
        G.arc[k1][k2]=G.arc[k2][k1]=0;
    }
    else if(G.type==DN)
    {
        G.arc[k1][k2]=Infinity;
    }
    else if(G.type==UDN)
    {
        G.arc[k1][k2]=G.arc[k2][k1]=Infinity;
    }
    G.arcnum--;
}
bool visited[MAXSIZE];
int DFS(int index,Graph&G)
{
    visited[index]=true;
    cout<<G.vertex[index]<<" ";
    char v=GetVertex(index,G);
    for(index=firstadjacent(v,G);index!=-1;index=nextadjacent(v,GetVertex(index,G),G))
    if(!visited[index])DFS(index,G);
    return OK;
}
int DFS1(int index,Graph&G)
{
    visited[index]=true;
    cout<<G.vertex[index]<<" ";
    for(int i=1;i<=index;i++)
    {
        if(G.arc[index][i]!=0&&!visited[i])DFS1(i,G);
    }
}
//深度优先遍历图中顶点
int DFStraverse(Graph&G)
{
    for(int i=1;i<=G.vertexnum;i++)visited[i]=false;
    for(int i=1;i<=G.vertexnum;i++)
        if(!visited[i])DFS1(i,G);
        cout<<endl;
    return OK;
}
//广度优先遍历图中顶点
int BFStraverse(Graph&G)
{
    char v;
   queue<char>Q;
   for(int i=1;i<=G.vertexnum;i++)visited[i]=false;
   for(int i=1;i<=G.vertexnum;i++)
     if(!visited[i])
     {
       visited[i]=true;
       cout<<G.vertex[i]<<" ";
       v=G.vertex[i];
       Q.push(v);
       while(!Q.empty())
       {
         v=Q.front();
         Q.pop();
         for(int index=firstadjacent(v,G);index!=-1;index=nextadjacent(v,GetVertex(index,G),G))
           if(!visited[index])
           {
             visited[index]=true;
             cout<<G.vertex[index]<<" ";
             Q.push(G.vertex[index]);
           }
       }
     }
   cout<<endl;
}
int main()
{
    Graph G;
    create(G);
    print(G);
    cout<<"深度遍历:"<<endl;
    DFStraverse(G);
    cout<<"广度遍历:"<<endl;
    BFStraverse(G);
    return 0;
}

以上就是 直播短视频源码,邻接矩阵实现图的相关代码,更多内容欢迎关注之后的文章

目录
相关文章
|
7月前
|
设计模式 移动开发 IDE
淘宝短视频流工程重构(上):理论篇
淘宝短视频流工程重构(上):理论篇
124 7
|
6月前
|
vr&ar
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
这篇文章介绍了一种简单易懂的全景图高清下载方法,使用在线网站全景管家,支持下载包括建E、720yun、酷雷曼等多个平台的全景图原图,并简要解析了全景图的原理和制作方法。
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
|
6月前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
441 0
|
人工智能 JSON API
|
算法 定位技术 C++
A* 算法详解(超级详细讲解,附有大图)
A* 算法详解(超级详细讲解,附有大图)
2574 0
|
9月前
|
算法 索引 容器
俄罗斯方块游戏开发实战教程(2):随机创建不同的形状
俄罗斯方块游戏开发实战教程(2):随机创建不同的形状
138 0
|
vr&ar 图形学
visionOS空间计算实战开发教程Day 2 使用RealityKit显示3D素材
我们在Day1中学习了如何创建一个visionOS应用,但在第一个Demo应用中我们的界面内容还是2D的,看起来和其它应用并没有什么区别。接下来我们先学习如何展示3D素材,苹果为方便开发人员,推出了RealityKit,接下来看如何使用。
129 0
[笔记]音视频学习之ffmpeg实践《一》常用结构体及裁剪画面思路(下)
[笔记]音视频学习之ffmpeg实践《一》常用结构体及裁剪画面思路(下)
|
存储 数据格式
[笔记]音视频学习之ffmpeg实践《一》常用结构体及裁剪画面思路(上)
[笔记]音视频学习之ffmpeg实践《一》常用结构体及裁剪画面思路
|
存储 算法 小程序
微信小游戏开发实战13-随机生成形状功能的实现
本节内容包括:通过使用列表来实现可以设置权重的随机功能,以及游戏中的随机生成形状功能的具体实现。 如果你没有任何的游戏开发经验,欢迎阅读我的“人人都能做游戏”系列教程,它会手把手的教你做出自己的第一个小游戏。
165 0