数据结构之图、广度优先搜索以及佛洛依德算法

实验要求
  • 实现图的抽象数据类型
  • 在邻接矩阵结构上实现图的建立运算
  • 在邻接表结构上实现图的建立运算
  • 实现网的遍历运算(广度优先)
  • 实现最短路径算法(floyd)
实验代码
  • 实现图的抽象数据类型
//邻接矩阵结构
typedef struct ArcCell
{
    EType adj;
    InfoType info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct
{
    VertexType vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum,arcnum;
    GraphKind kind;
}MGraph;

//邻接表结构
typedef struct ArcNode
{   int adjvex;
    struct ArcNode *nextarc;
    InfoType *info;
}ArcNode;

typedef struct VNode  //define structure ALGraph
{   VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct
{   AdjList vertices;
    int vexnum,arcnum;
    int kind;
}ALGraph;
  • 在邻接矩阵结构上实现图的建立运算
int CreatUDN(MGraph &G)
{
    int i=0,j=0,k,vi,vj,w;

    //-----Demo G.vexnum and G.arcnum------
    G.vexnum=3;
    G.arcnum=5;
    //-----------------------------------------

    printf("Please input the number of G.vexnum(eg,G.vexnum=3) : ");
    scanf("%d",&G.vexnum);
    printf("Please input the number of G.arcnum(eg,G.arcxnum=5) : ");
    scanf("%d",&G.arcnum);

    for(i=0;i<G.vexnum;++i)
        for(j=0;j<G.vexnum;++j)
        {
            G.arcs[i][j].info=INFINITY;
            if(i==j) G.arcs[i][j].info=0;
        }//end of for(j=0;j<G.vexnum;++j)

        cout<<"Please input arc(Vi-->Vj):"<<endl
            <<"For example:"<<endl<<"=============="<<endl
            <<"(Vi=1,Vj=2,Weight=4),(Vi=1,Vj=3,Weight=11),(Vi=2,Vj=1,Weight=6)"<<endl
            <<"(Vi=2,Vj=3,Weight=2),(Vi=3,Vj=1,Weight=3)..."<<endl;
        for(k=0;k<G.arcnum;++k)
        {
            cout<<endl<<"Please input the "<<k+1<<"the arc's vi (0<vi<"<<G.vexnum+1<<"): ";
                cin>>vi;
            cout<<"Please input the "<<k+1<<"the arc's vj (0<vj<"<<G.vexnum+1<<"): ";
                cin>>vj;
            cout<<"Please input the "<<k+1<<"the arc's weight (0<weight<"<<INFINITY<<"): ";
                cin>>w;
            i=vi;
            j=vj;
            while(i<1||i>G.vexnum||j<1||j>G.vexnum||w<0)
            {
                cout<<"Input ERROR!"<<endl
                    <<"Please input the "<<k+1<<"the arc's vi (0<vi<"<<G.vexnum+1<<"): ";
                cin>>vi;
            cout<<"Please input the "<<k+1<<"the arc's vj (0<vj<"<<G.vexnum+1<<"): ";
                cin>>vj;
            cout<<"Please input the "<<k+1<<"the arc's weight (0<weight<"<<INFINITY<<"): ";
                cin>>w;
            i=vi;
            j=vj;
            }//end of while
            i--;
            j--;
            G.arcs[i][j].info=w;
        }//end of for
        return (OK);
}//end of CreateUDN() function
  • 在邻接表结构上实现图的建立运算
int CreateDG(ALGraph &G)  //CreateDG() sub-function
{
    int IncInfo,i,j,k,v1,v2,w;
    cout<<endl<<"请输入图的顶点个数(eg. G.vexnum=4):";
    cin>>G.vexnum;
    cout<<"请输入图的弧的条数(eg. G.arcnum=4):";
    cin>>G.arcnum;
    cout<<"请输入图的弧上的信息(0 for none)   :";
    cin>>IncInfo;
    for(i=0;i<G.vexnum;++i)//initial G.vertices
    {G.vertices[i].data=i;
    G.vertices[i].firstarc=NULL;}

    cout<<"请输入弧arc(v1->v2),fo example:(v1=1,v2=3),(v1=2,v2=4)...";
    for(k=0;k<G.arcnum;++k)  //input arc(v1,v2)
    {
        cout<<endl<<"请输入第"<<k+1<<"条弧的起始顶点 v1(0<v1<G.vexnum):";
        cin>>v1;
        cout<<"请输入第"<<k+1<<"条弧的终止顶点 v2(0<v2<G.vexnum):";
        cin>>v2;
        i=v1;
        j=v2;
        while(i<1||i>G.vexnum||j<1||j>G.vexnum)//if(v1,v2) illedal again
        {
            cout<<endl<<"请输入第"<<k+1<<"条弧的起始顶点 v1(0<v1<G.vexnum):";
            cin>>v1;
            cout<<"请输入第"<<k+1<<"条弧的终止顶点 v2(0<v2<G.vexnum):";
            cin>>v2;
        }//while end

        i--;
        j--;
        ArcNode *p;
        p=(ArcNode *)malloc(sizeof(ArcNode));//allocate memory
        if(!p)
        {cout<<"Overflow!"; return(0);}
        p->adjvex=j;  //assign p
        p->nextarc=G.vertices[i].firstarc;
        p->info=NULL;
        G.vertices[i].firstarc=p;

        if(IncInfo)
        {cout<<"请输入info:";
        cin>>*(p->info);}
    }//end of if 
    return (OK);
}//end of CreateDG()
  • 实现网的遍历运算(广度优先)
void BFSTraverse(ALGraph G)//BFSTraverse() sub-function

{

 int v,w,u;

 int visited[MAX_VERTEX_NUM];

 SqQueue Q;

 for(v=0;v<G.vexnum;++v)

 visited[v]=0;

 InitQueue(Q);

 for(v=0;v<G.vexnum;++v)

 if(visited[v]==0)

 {

 visited[v]=1;

 cout<<v+1<<"-->";

 EnQueue(Q,v);

 while(!QueueEmpty(Q))

 {

 DeQueue(Q,u);

 for(w=G.vertices[u].data;

 G.vertices[u].firstarc!=NULL;

 w=G.vertices[u].firstarc->adjvex,

 G.vertices[u].firstarc=G.vertices[u].firstarc->nextarc)//"右)"

 if(visited[w]==0)

 {

 visited[w]=1;

 cout<<w+1<<"-->";

 EnQueue(Q,w);

 }//if end

 if(visited[w]==0)

 {

 visited[w]=1;

 cout<<w+1<<"-->";

 EnQueue(Q,w);

 }//if end

 }//while end

 }//if end
}//BFSTraverse() end
  • 实现最短路径算法(floyd)
void ShortestPath_FLOYD(MGraph G,
                      PathMatrix Path[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM],
                      DistancMatrix Dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM])
{
    int i,j,u,v,w;
    for(v=0;v<G.vexnum;++v)
        for(w=0;w<G.vexnum;++w)
        {   Dist[v][w]=G.arcs[v][w].info;
            for(u=0;u<G.vexnum;++u)
                Path[v][w][u]=FALSE;
            if(Dist[v][w]<INFINITY)
            {   Path[v][w][v]=TRUE;
                Path[v][w][w]=TRUE;
            }//end of if
        }//end of for
    for(u=0;u<G.vexnum;++u)
        for(v=0;v<G.vexnum;++v)
            for(u=0;u<G.vexnum;++u)
                if(Dist[v][u]+Dist[u][w]<Dist[v][w])
                {   Dist[v][w]=Dist[v][u]+Dist[u][w];
                    for(i=0;i<G.vexnum;++i)
                        Path[v][w][i]=Path[v][u][i]||Path[u][w][i];
                }//end of if
//------------print the last Dist[i][j]---------------
                printf("Vertice");
                for(i=0;i<G.vexnum;i++)
                    printf("%5d",i+1);
                printf("\n");
                for(i=0;i<G.vexnum;i++)
                {
                    printf("%5d    ",i+1);
                    for(j=0;j<G.vexnum;j++)
                        printf("%5d",Dist[i][j]);
                    printf("\n");
                }//end of for
//---------------------------------------------------
}//shortestPath_FLOYD() end

相关文章:
数据结构之栈(C语言版)
数据结构之树的相关问题

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容