大數據

短視頻直播源碼,有向網的拓撲排序

短視頻直播源碼,有向網的拓撲排序實現的相關代碼如下

/*
    Author:Albert Tesla Wizard
    Time:2020/10/28 23:07
*/
#include<bits/stdc++.h>
#define OK 1
#define Error 0
#define MAXSIZE 20
using namespace std;
typedef enum{DG,UDG,DN,UDN}Grpahkind;
typedef struct ArcNode
{
    ArcNode* nextarc;
    int* info;
    int adjvertex;
};
typedef struct VNode
{
    char data;
    ArcNode* firstarc;
}VNode,AdjList[MAXSIZE];
typedef struct ALGraph
{
    AdjList vertex;
    int vertexnum,arcnum;
    int kind;
}ALGraph;
int Locate(char v,ALGraph&G)
{
    for(int i=1;i<=G.vertexnum;i++)
    {
        if(G.vertex[i].data==v)return i;
    }
    return -1;
}
int create(ALGraph&G)
{
        char c1,c2;
        int tail,head,w;
        cout<<"請輸入有向網的頂點數目:"<<endl;
        cin>>G.vertexnum;
        cout<<"請輸入有向網的弧的數目:"<<endl;
        cin>>G.arcnum;
        cout<<"請輸入有向網的頂點集合:"<<endl;
        for(int i=1;i<=G.vertexnum;i++){cin>>G.vertex[i].data;G.vertex[i].firstarc=NULL;}
        for(int i=1;i<=G.arcnum;i++)
        {
            cout<<"請輸入組成有向網的弧的兩個頂點c1,c2的值及該弧權值:"<<endl;
            cin>>c1>>c2>>w;
            tail=Locate(c1,G);
            head=Locate(c2,G);
            ArcNode* p=new ArcNode;
            p->info=new int;
            *(p->info)=w;
            p->adjvertex=head;
            p->nextarc=G.vertex[tail].firstarc;
            G.vertex[tail].firstarc=p;
        }
    return OK;
}
void print(ALGraph&G)
{
    cout<<"有向網的頂點數目為:"<<G.vertexnum<<endl;
    cout<<"有向網的頂點集合為:";
    for(int i=1;i<=G.vertexnum;i++)cout<<G.vertex[i].data<<" ";
    cout<<endl;
    cout<<"有向網的弧的數目為:"<<G.arcnum<<endl;
    cout<<"有向網弧的集合為:";
        for(int i=1;i<=G.vertexnum;i++)
        {
            ArcNode* p=G.vertex[i].firstarc;
            while(p)
            {
                cout<<"<"<<G.vertex[i].data<<","<<G.vertex[p->adjvertex].data<<","<<*(p->info)<<">";
                p=p->nextarc;
            }
        }
        cout<<endl;
}
void FindInDegree(int indegree[],ALGraph G)
{
    ArcNode* p;
    for(int i=1;i<=G.vertexnum;i++)indegree[i]=0;
    for(int i=1;i<=G.vertexnum;i++)
    {
        p=new ArcNode;
        p=G.vertex[i].firstarc;
        while(p)
        {
            indegree[p->adjvertex]++;
            p=p->nextarc;
        }
    }
}
int TopologicalSort(ALGraph G)
{
    int cnt=0,indegree[MAXSIZE];//輸出的頂點數
    stack<int>S;
    ArcNode* p;
    FindInDegree(indegree,G);
    for(int i=1;i<=G.vertexnum;i++)if(!indegree[i])S.push(i);
    while(!S.empty())
    {
        int j=S.top();
        S.pop();
        cout<<G.vertex[j].data<<" ";
        cnt++;
        for(p=G.vertex[j].firstarc;p;p=p->nextarc)
        {
            int k=p->adjvertex;
            if(!(--indegree[k]))S.push(k);
        }
    }
    if(cnt<G.vertexnum){cout<<"該有向網有迴路"<<endl;return Error;}
    else {cout<<"為一個拓撲序列"<<endl;return OK;}
}
int main()
{
    system("color 5E");
    ALGraph G;
    create(G);
    print(G);
    TopologicalSort(G);
    return 0;
}

以上就是短視頻直播源碼,有向網的拓撲排序實現的相關代碼, 更多內容歡迎關注之後的文章

Leave a Reply

Your email address will not be published. Required fields are marked *