[NEFU锐格 数据结构]实验五六 图有关的操作

[NEFU锐格 数据结构]实验五六 图有关的操作

推荐阅读:[数据结构]NEFU 大二上 锐格实验参考 目录

知识点

题目知识点
7043无向图广度优先遍历
7039有向图DFS和打印邻接表
7040建图,求度数
7042无向图非递归DFS
7041求拓扑序列

题目

7043

利用邻接表实现无向图的广度优先遍历

#include<iostream>
#include<cstring>
#include<queue>

using namespace std;

const int MAXN=105;

typedef struct ArcNode{
    int adjvex;
    struct ArcNode * nextarc;
}ArcNode;

typedef struct VNode{
    int data;
    ArcNode *firstarc;
}VNode,AdjList[MAXN];

typedef struct{
    AdjList verlist;
    int vexnum,arcnum;
}Graph;

void CreateUDG(Graph &G){
    cin>>G.vexnum>>G.arcnum;
    for(int i=1;i<=G.vexnum;i++){
        cin>>G.verlist[i].data;//没有其他数据啊这题,data没啥意义的只是应付输入而已
        G.verlist[i].firstarc=NULL;
    }
    for(int i=1;i<=G.arcnum;i++){
        int x,y;cin>>x>>y;

        ArcNode * p1= new ArcNode;
        ArcNode * p2= new ArcNode;

        p1->adjvex=y;
        p1->nextarc=G.verlist[x].firstarc;
        G.verlist[x].firstarc=p1;

        p2->adjvex=x;
        p2->nextarc=G.verlist[y].firstarc;
        G.verlist[y].firstarc=p2;
    }
}

void BFS(Graph G){
    queue<int>Q;
    bool vis[MAXN];
    memset(vis,0,sizeof(vis));
    cout<<"v1 ";
    Q.push(1);
    vis[1]=true;
    while(!Q.empty()){
        int u=Q.front();Q.pop();
        ArcNode* p=G.verlist[u].firstarc;
        while(p!=NULL){
            if(!vis[p->adjvex]){
                cout<<"v"<<p->adjvex<<" ";
                vis[p->adjvex]=true;
                Q.push(p->adjvex);
            }
            p=p->nextarc;
        }
    }
}

int main(){
    Graph G;
    CreateUDG(G);
    BFS(G);
    return 0;
}

7039

有向图DFS和打印邻接表

#include<iostream>
#include<cstring>
#include<queue>

using namespace std;

const int MAXN=105;

typedef struct ArcNode{
    int adjvex;
    struct ArcNode * nextarc;
}ArcNode;

typedef struct VNode{
    int data;
    ArcNode *firstarc;
}VNode,AdjList[MAXN];

typedef struct{
    AdjList verlist;
    int vexnum,arcnum;
}Graph;

void CreateUDG(Graph &G){
    cin>>G.vexnum>>G.arcnum;
    for(int i=1;i<=G.vexnum;i++){
        cin>>G.verlist[i].data;
        G.verlist[i].firstarc=NULL;
    }
    for(int i=1;i<=G.arcnum;i++){
        int x,y;cin>>x>>y;

        ArcNode * p1= new ArcNode;

        p1->adjvex=y;
        p1->nextarc=G.verlist[x].firstarc;
        G.verlist[x].firstarc=p1;
    }
}

void Print(Graph G){
    for(int i=1;i<=G.vexnum;i++){
        ArcNode* p=G.verlist[i].firstarc;
        cout<<i<<":";
        while(p!=NULL){
            cout<<p->adjvex;
            if(p->nextarc!=NULL)cout<<" ";
            p=p->nextarc;
        }
        cout<<endl;
    }
}
bool vis[MAXN];
void DFS(Graph G,int u){
    ArcNode* p=G.verlist[u].firstarc;
    vis[u]=true;
    cout<<u<<" ";
    while(p!=NULL){
        if(!vis[p->adjvex]){
            DFS(G,p->adjvex);
        }
        p=p->nextarc;
    }
}

int main(){
    Graph G;
    CreateUDG(G);
    Print(G);
    DFS(G,1);
    return 0;
}

7040

求度数相关的,写麻烦了,直接建图的时候统计就行了。可以看拓扑序列那里的建图操作。

#include<iostream>
#include<cstring>
#include<queue>

using namespace std;

const int MAXN=105;

typedef struct ArcNode{
    int adjvex;
    struct ArcNode * nextarc;
}ArcNode;

typedef struct VNode{
    int data;
    ArcNode *firstarc;
}VNode,AdjList[MAXN];

typedef struct{
    AdjList verlist;
    int vexnum,arcnum;
}Graph;

void CreateUDG(Graph &G){
    cin>>G.vexnum>>G.arcnum;
    for(int i=1;i<=G.vexnum;i++){
        cin>>G.verlist[i].data;
        G.verlist[i].firstarc=NULL;
    }
    for(int i=1;i<=G.arcnum;i++){
        int x,y;cin>>x>>y;

        ArcNode * p1= new ArcNode;

        p1->adjvex=y;
        p1->nextarc=G.verlist[x].firstarc;
        G.verlist[x].firstarc=p1;
    }
}
int in[MAXN],out[MAXN];
void GetInfo(Graph G){
    for(int i=1;i<=G.vexnum;i++){
        ArcNode* p=G.verlist[i].firstarc;
        while(p!=NULL){
            in[p->adjvex]++;
            out[i]++;
            p=p->nextarc;
        }
    }
}


int main(){
    Graph G;
    CreateUDG(G);
    GetInfo(G);
    for(int i=1;i<=G.vexnum;i++){
        cout<<i<<":"<<in[i]<<" "<<out[i]<<" "<<in[i]+out[i]<<endl;
    }
    return 0;
}

7042

无向图非递归DFS

#include<iostream>
#include<cstring>
#include<stack>

using namespace std;

const int MAXN=105;

typedef struct ArcNode{
    int adjvex;
    struct ArcNode * nextarc;
}ArcNode;

typedef struct VNode{
    int data;
    ArcNode *firstarc;
}VNode,AdjList[MAXN];

typedef struct{
    AdjList verlist;
    int vexnum,arcnum;
}Graph;

void CreateUDG(Graph &G){
    cin>>G.vexnum>>G.arcnum;
    for(int i=1;i<=G.vexnum;i++){
        cin>>G.verlist[i].data;
        G.verlist[i].firstarc=NULL;
    }
    for(int i=1;i<=G.arcnum;i++){
        int x,y;cin>>x>>y;

        ArcNode * p1= new ArcNode;
        ArcNode * p2= new ArcNode;

        p1->adjvex=y;
        p1->nextarc=G.verlist[x].firstarc;
        G.verlist[x].firstarc=p1;

        p2->adjvex=x;
        p2->nextarc=G.verlist[y].firstarc;
        G.verlist[y].firstarc=p2;
    }
}

bool vis[MAXN];
void DFS(Graph G,int u){
    stack<int>stk;
    stk.push(u);vis[u]=true;
    cout<<"v1 ";
    while(!stk.empty()){
        int tt=stk.top();
        ArcNode *p=G.verlist[tt].firstarc;
        while(p&&vis[p->adjvex]){
            p=p->nextarc;
        }
        while(p&&!vis[p->adjvex]){
            cout<<"v"<<p->adjvex<<" ";
            vis[p->adjvex]=true;
            stk.push(p->adjvex);
            p=G.verlist[p->adjvex].firstarc;
        }
        if(p==NULL)stk.pop();
    }
}

int main(){
    Graph G;
    CreateUDG(G);
    DFS(G,1);
    return 0;
}

7041

求拓扑序列,但是这玩意我感觉不是很好吧,不唯一的东西。可能你弄出来的拓扑序列也对的但是题目没加Special Judge

#include<iostream>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;

const int MAXN=105;

typedef struct ArcNode{
    int adjvex;
    struct ArcNode * nextarc;
}ArcNode;

typedef struct VNode{
    int data;
    ArcNode *firstarc;
}VNode,AdjList[MAXN];

typedef struct{
    AdjList verlist;
    int vexnum,arcnum;
}Graph;

int deg[MAXN];
void CreateUDG(Graph &G){
    cin>>G.vexnum>>G.arcnum;
    for(int i=1;i<=G.vexnum;i++){
        cin>>G.verlist[i].data;
        G.verlist[i].firstarc=NULL;
    }
    for(int i=1;i<=G.arcnum;i++){
        int x,y;cin>>x>>y;
        deg[y]++;
        ArcNode * p1= new ArcNode;

        p1->adjvex=y;
        p1->nextarc=G.verlist[x].firstarc;
        G.verlist[x].firstarc=p1;
    }
}

void TopSort(Graph G){
    stack<int>s;
    for(int i=1;i<=G.vexnum;i++)
        if(!deg[i])s.push(i);
    while(!s.empty()){
        int tt=s.top();s.pop();
        cout<<"v"<<tt<<" ";
        ArcNode *p=G.verlist[tt].firstarc;
        while(p!=NULL){
            deg[p->adjvex]--;
            if(deg[p->adjvex]==0)s.push(p->adjvex);
            p=p->nextarc;
        }
    }
}

int main(){
    Graph G;
    CreateUDG(G);
    TopSort(G);
    return 0;
}
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值