首页 > 编程语言 >图有关算法题

图有关算法题

时间:2023-11-11 20:45:14浏览次数:45  
标签:结点 adjlist int 有关 算法 nextarc firstarc adjvex

图的结构

//严蔚敏版数据结构
//邻接表存储结构
typedef struct ArcNode{
    int adjvex;//该弧所指向的顶点的位置
    struct ArcNode *nextarc;//下一个边结点
}ArcNode;

typedef struct VNode{
    VertexType data;//顶点信息
    struct ArcNode *firstarc;//第一个邻接点
}VNode, AdjList;

typedef struct{
    AdjList vertexs[MAX_VERTEX_NUM];	//邻接表AdjList adjlist[MAX_VERTEX_NUM];
    int vexnum,arcnum;
}ALGraph;

//邻接矩阵存储结构
typedef struct ArcCell{
    VRtype adj;//顶点关系
    InfoType *info;
}ArcCell, AdjMartix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct{
    VertexType vexs[MAX_VERTEX_NUM];//顶点向量表
    AdjMaritx arcs; //邻接矩阵
}MGraph;


BFS广度优先算法

Status (*Visit)(int v);//函数指针
Boolean visited[MAX];

void BFSTraverse(Graph G)
{
    int u,v,w;
    for(v=0;v<G.vexnum;v++)
        visited[v]=FLASE;//初始化visited数组
    InitQueue(Q);//初始化队列
    for(v=0;v<G.vexnum;v++)
    {
        if(!visited[v])
        {
            Visit(v);visited[v]=TRUE;
            EnQueue(Q,v);
            while(!QueueEmpty(Q))
            {
                DeQueue(Q,u);
                for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
                {
                    if(!visited[w])
                    {
                        Visit(w);
                        visited[w]=TRUE;
            			EnQueue(Q,w);
                    }
                }
            }
        }
    }
}


DFS深度优先算法(邻接矩阵)

void DFSTraverse(Graph G){
    for(i=0;i<G.vexnum;i++)
        visited[i]=false;	//初始化标记数组
    for(i=0;i<G.vexnum;i++){
        if(!visited[i])
            DFS(G,i);
    }
}

void DFS(Graph G, int v){
    visited[v]=true;	//true表示顶点v已经访问过了
    Visit(v);	//访问顶点
    for(w=FirstAdjvex(G,u);w>=0;w=NextAdjvex(G,u,w)){
        if(!visited[w]){
            DFS(G,w);
        }
    }
}



DFS深度优先算法非递归算法(邻接矩阵存储)

void DFS(Graph G,int v){
    InitStack(S);//初始化栈
    for(i=0;i<G.vexnum;i++)
        visited[i]=false;	//初始化标记数组
    Push(S,v);	//顶点v入栈
    visted[v]=true;
    while(!StackEmpty(S)){
        Pop(S,k);	//出栈
        Visit(k);
        for(w=FiristAdjVex(G,k);w>=0;w=NextAdjVex(G,k,w)){
			if(!visited[w]){
                Push(S,w);
                visited[w]=true;
            }
        }      
    }
}


图采用邻接表存储,设计算法判断vi和vj结点之间是否有路径

//基于DFS算法
bool visited[maxsize];
bool Pathi_j(ALGraph g, int vi, int vj){
    for(i=0;i<g.vexnum;i++)
        visited[i]=false;
    DFS(g,vi);
    if(visited[vj])	//如果vj被访问过则说明vi,vj之间有路径
        return true;
    else
        return false;
}

void DFS(ALGraph g, int v){
    visited[v]=true;
    p=g.adjlist[v].firstarc;
    while(p){
        if(!visited[p->adjvex]){
            DFS(p->adjvex);
        }
        p=p->nextarc;
    }
}



设计算法判断无向图是否是一棵树(图采用邻接表存储)

/*
树其实是一种特殊的图。树的特点就是,有n结点,有n-1条边。并且连通。
对一个图进行遍历,使用一次深度优先遍历算法(DFS)。
	如果边数为n-1
	结点数为n
那么,就说明这个图可以称之为一棵树。
*/
//基于DFS算法
bool visited[maxsize];
bool IsTree(ALGraph g){
    for(i=0;i<g.vexnum;i++)
        visited[i]=false;
    for(i=0;i<g.vexnum;i++){
        if(!visited[i])
            DFS(g,i,vexnum,arcnum);
    }
    if(g.vexnum==vexnum&&2*(g.arcnum-1)==arcnum)	//无向图中边结点要存储两次,遍历完之后结点有2(n-1)
    	return true;
    else
        return false;
}

void DFS(ALGraph g, int v, int &vexnum, int &arcnum){
    visited[v]=true;
    vexnum++;
    p=g.adjlist[v].firstarc;
    while(p){
        arcnum++;
        if(!visited[p->adjvex]){
            DFS(g,p->adjvex,vexnum,arcnum);
        }
        p=p->nextarc;
    }
}

邻接表转邻接矩阵

MGraph ALToM(ALGraph g){
    MGraph G;
     for(i=0;i<g.vexnum;i++)
        for(j=0;j<g.vexnum;j++)
        	G.arcs[i][j].adj=0;	//邻接矩阵全部赋值为0
    for(i=0;i<g.vexnum;i++)
        G.vexs[i]=g.adjlist[i].data;	//顶点表赋值
    for(i=0;i<g.vexnum;i++){
        p=g.adjlist[i].firstarc;
        while(p){
            G.arcs[i][p->adjvex].adj=1;	//i-->adjvex
            p=p->nextarc;
        }
    }
    G.vexnum=g.vexnum;
    G.arcnum=g.arcnum;
    return G;
}


设无向图 G有 n个顶点,m 条边试编写用邻接表存储该图的算法。(设顶点值用1~n 或0~n-1 编号)

void Creat_Graph(ALGraph &g){
	scanf(&n);	//输入边数和顶点数 cin>>n>>m;
    scanf(&m);
    for(i=0;i<n;i++){
        scanf(&g.adjlist[i].data);	//顶点表赋值
        g.adjlist[i].firstarc=NULL;	//清空边表
    }
    for(k=0;k<m;k++){
        scanf(&v1);	//输入顶点数
        scanf(&v2);
        i=LocateVex(g,v1);	//定位顶点
        j=LocateVex(g,v2);	//定位顶点
        p=(ArcNode*)malloc(sizeof(ArcNode));	//申请边结点
        p->adjvex=j;		//无向图的邻接表存储中边结点需要存储两次
        p->nextarc=g.adjlist[i].firstarc;
        g.adjlist[i].firstarc=p;	//边表采用头插法
        q=(ArcNode*)malloc(sizeof(ArcNode));	//申请新结点 存储另外一条边
        q->adjvex=i;
        q->nextarc=g.adjlist[j].firstarc;
        g.adjlist[i].firstarc=q;
    }
}


无向图删除边结点(邻接表存储)

Status Delete_Arc(ALGraph &G, int v, int w){
	k1=LocateVex(G,v);
    k2=LocateVex(G,v);
    if(!k1||!k2)
        return ERROR;
    p=G.adjlist[k1].firstarc;
    if(p && p->adjvex==k2){	//边表第一个结点是待删除结点
        G.adjlist[k1].firstarc=p->nextarc;
        free(p);
    }
    else{
		while(p && p->adjvex!=k2){
			q = p;	//q是p的前驱结点
			p = p->nextarc;
		}
		if(!p)
			return ERROR;								//欲删除的边不存在
		else{
			q->nextarc = p->nextarc;
			free(p);
		}	 
	}
    
    //无向图删除另一条边
    p = G.adjlist[k2].firstarc;
    if(p && p->adjvex==k1){	//边表第一个结点是待删除结点
        G.adjlist[k2].firstarc=p->nextarc;
        free(p);
    }
    else{
		while(p && p->adjvex!=k1){
			q = p;	//q是p的前驱结点
			p = p->nextarc;
		}
		
		if(!p)
			return ERROR;								//欲删除的边不存在
		else{
			q->nextarc = p->nextarc;
			free(p);
		}	 
	}
    
}

无向图插入边结点(邻接表存储)

Status InsertArc(ALGraph &g, int u, int v){
    i = LocateVex(u);
    j = LocateVex(v);
    if(!i==!j)
        return ERROR;
    
    p=(ArcNode*)malloc(sizeof(ArcNode));	//申请边结点
    p->adjvex=j;		//无向图的邻接表存储中边结点需要存储两次
    p->nextarc=g.adjlist[i].firstarc;
    g.adjlist[i].firstarc=p;	//边表采用头插法
    q=(ArcNode*)malloc(sizeof(ArcNode));	//申请新结点 存储另外一条边
    q->adjvex=i;
    q->nextarc=g.adjlist[j].firstarc;
    g.adjlist[i].firstarc=q;
    
    g.arcnum++;
    
    return OK;
}

标签:结点,adjlist,int,有关,算法,nextarc,firstarc,adjvex
From: https://www.cnblogs.com/qianxiaohan/p/17826323.html

相关文章

  • 有关于时间转换问题
    有关于时间转换split函数s1='lcyisapig'foriins1.split():#['lcy','is','a','pig']print(i)s2='lcyisapig'foriins2.split(''):#['','lcy','......
  • 重新学习算法_Day3-哈希表&2283&str与list转换
    HashTable 感觉从原理上说会用但是实际应用感觉不知道有什么用或者不知道怎么用例如:给你一个下标从 0 开始长度为 n 的字符串 num ,它只包含数字。如果对于 每个 0<=i<n 的下标 i ,都满足数位 i 在 num 中出现了 num[i]次,那么请你返回 true ,否则返回......
  • SMOGN算法的Python实现:不平衡数据的深度学习回归
      本文介绍基于Python语言中的smogn包,读取.csv格式的Excel表格文件,实现SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。  在不平衡回归问题中,样本数量的不均衡性可能导致模型在预测较少类别的样本时表现较差;为了解决这个问题,可以使用SMOTE(Syn......
  • 图有关算法题(1)
    图的结构//严蔚敏版数据结构//邻接表存储结构typedefstructArcNode{intadjvex;//该弧所指向的顶点的位置structArcNode*nextarc;//下一个边结点}ArcNode;typedefstructVNode{VertexTypedata;//顶点信息structArcNode*firstarc;//第一个邻接点......
  • 《空间三角面片对相交判断算法》的matlab实现
    function[flag]=InsectTriPatch(T1,T2)%判断两个空间三角形面片是否相交%T1=[000;%200;%01.50;%001];%T2=[00-1;%20-1;%02-1;%001];%出自:《空间三角面片对相交判断算法......
  • 11.11算法
    题目填充每个节点的下一个右侧节点指针给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个右......
  • 【学习笔记】随机化算法
    例题P7831[COCI2009-2010#3]PATULJCI题解首先对每个颜色开一个vector<int>保存其位置,随后对于一段区间\([l,r]\)和一个颜色\(c\),可以很快速的求出\([l,r]\)内\(c\)出现的次数。然后进行随机化,每次随机一个元素并查看他的出现次数。若随机\(t\)次,那么随机不到的概率是\(\frac......
  • Vue源码学习(十六):diff算法(三)暴力比对
    好家伙,这是diff的最后一节了 0.暴力比对的使用场景 没有可复用的节点:当新旧虚拟DOM的结构完全不同,或者某个节点不能被复用时,需要通过暴力比对来创建新的节点,并在真实DOM上进行相应的插入操作。0.1.例子一://创建vnodeletvm1=newVue({data:{name:'张三'......
  • 回溯算法
    回溯算法处理5w条数据优化❓:我想根据当前节点id回溯出他的路径层级扁平数组......
  • LRU算法 C++
    #pragmaonce#include<list>#include<unordered_map>usingnamespacestd;classLRUCache{public:LRUCache(intcapacity):cap(capacity){m.reserve(capacity);m.max_load_factor(0.75);}intget(intkey)......