数据结构图论学习总结2

邻接表:

struct EdgeNode//定义边表节点
{
	int adjvex;//临接点域
	EdgeNode *next;
};
template<typename DataType>
struct VertexNode//定义顶点表节点
{
	DataType vertex;
	EdgeNode *firstEdge;
};

具体实现过程;
在这里插入图片描述

template <class T>
ALGraph::ALGraph(T a[ ], int n, int e)
{   
    vertexNum=n; arcNum=e; 
    for (i=0; i<vertexNum; i++)   
    {
       adjlist[i].vertex=a[i];
       adjlist[i].firstedge=NULL;      
    } 
     for (k=0; k<arcNum; k++)   
     {
         cin>>i>>j;    
         s=new ArcNode; s->adjvex=j;  //单链表的头插方法	        
         s->next=adjlist[i].firstedge;    
         adjlist[i].firstedge=s;
     }
}

边集数组:

Struct edge
{ 
    int i;
    int j;
    int weight;
}

一条边连接两个点;
算法问题:
1.最小生成树
prim算法

void MinEdge(int lowcast[],int vertexNum)
{
	int k;
	int Min=9999;
	for(int i=1;i<=vertexNum;i++)
	{
		if(lowcast[i]!=0&&lowcast<Min)
		{
			Min=lowcast[i];
			k=I;
		}
	}
	return k;
}
Void prime(int v){
    for(int i=1;i<vertexNum;i++){
        lowcost[i]=edge[0][i];  adjvex[i]=0;
    }
    lowcost[0]=0;
    for(i=1;i<vertexNum;i+++){
        k=MinEdge(lowcost,vertexNum)
        cout<<K<<adjvex[k]<<lowcost[k];
        lowcost[k]=0;
             for(j=1;j<vertexNum;j++)
          if((edge[k][j]<lowcost[j]){
              lowcost[j]=edge[k][j];
              adjvex[j]=k;
           }
    }
}


2.Kruskal算法
算法用了合并集的方法就是将两个不相关合起来;

struct Edge
{
    int weight;
    int from;
    int to;
}edge[MaxSize];
void Kruskal()
{
    int num=0,i,vex1,vex2;
    int parent[VertexNum];
    for(int i=0;i<vertexNum;i++)
    {
        parent[i]=-1;
    }
    for(num=0;i=0;num<vertexNum-1;i++)
    {
        vex1=FindRoot(parent,edge[i].from);
        vex2=FindRoot(parent,edge[i].to);
        if(vex1!=vex2){
            cout<<'('<<edge[i].from<<','<<edge[i].to<<')'<<edge[i].weight;
            parent[vex2]=vex1;
            num++;
        }
    }
}
int FindRoot(int parent[],int v)
{
    int t=v;
    while(parent[t]>-1)
    {
        t=parent[t];
    }
    return t;
}

2.最短路径算法
dijkstra算法

const int MAX=1000;
void  Dijkstra(MGraph g, int v){
       for ( i =0; i<g.vexnum ; i++){
	 dist[i]=g.arcs[v][i];  
               if ( dist[i]!= MAX) 
                      path [i]=g.vertex[v]+g.vertex[i];
               else
                      path[i]=“”;
       }
       S[0]=g.vertex[v]; 
       num=1;  
    While (num<g.vextexNum){
    k=0;
    for(i=0;i<G.vertexNum;i++)
           if((dist[i]<dist[k])   k=i
    cout<<dist[k]<<path[k];
    s[num++]=G.vertex[k];                
    for(i=0;i<G.vertexNum;i++)
             if(dist[k]+g.arc[k][i]<dist[i] {
		 dist[i]=dist[k]+g.arc[k][i];
                       path[i]=path[k]+g.vertex[i];
               }
}
}

Floyd算法

void Floyd(MGraph G)
{
    for (i=0; i<G.vertexNum; i++)        
       for (j=0; j<G.vertexNum; j++)
       {
          dist[i][j]=G.arc[i][j];
          if (dist[i][j]!=) 
               path[i][j]=G.vertex[i]+G.vertex[j];
          else path[i][j]=""; 
       }
     for (k=0; k<G.vertexNum; k++)         
        for (i=0; i<G.vertexNum; i++)       
           for (j=0; j<G.vertexNum; j++)
               if (dist[i][k]+dist[k][j]<dist[i][j]) {
                    dist[i][j]=dist[i][k]+dist[k][j];
                    path[i][j]=path[i][k]+path[k][j];
              }
}

Aov网与拓扑排序
AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,简称AOV网。

void TOpSort(){
int  top=-1, count=0;
for(int i=0;i<vertexnum;i++)
     if(adjlist[i].in==0) s[++top]=i;
while(top!=-1){
    j=s[top--]; cout <<adjlist[j].vertext;   count++;
    p=adjlist[j].firstedge;
    while(p!=NULL){
          k=p->adjvex; adjlist[k].in--;
         if(adjlist[k].in==0) s[top++]=k;
         p=p->next;
      } 
}
If (count<vertexNum) cout<<“有回路”;
}

删除所有入度为0的点如果最后还存在边,说明最后是有回路的。

关键路径
AOE网络:
在一个表示工程的带权有向图中,
用顶点表示事件,
用有向边表示活动,
边上的权值表示活动的持续时间,
称这样的有向图叫做边表示活动的网,简称AOE网。
AOE网中没有入边的顶点称为始点(或源点),没有出边的顶点称为终点(或汇点)。
现在还不太理解后续会总结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值