`
he91_com
  • 浏览: 376659 次
文章分类
社区版块
存档分类
最新评论

求关键路径(包含邻接表的建立、拓扑排序)

 
阅读更多

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int adjvex; //邻接点域
int info; //边上的信息
struct node *next;//指向下一个邻接点(或边)的指针域
}edgenode;


typedef struct vnode //顶点的表结点
{
int indegree; //存放顶点的入度
int vertex; // 顶点域
edgenode *firstedge;//边表头的指针
}vertexnode;

vertexnode adjlist[100];//顶点节点向量


void creatalgraph(int n,int e)//建立有向图的邻接表存储
{
int i,j,k,info;

edgenode *s;

for(i=0;i<n;i++)//建立n个顶点的定点表
{
// scanf("%c",&(adjlist[i].vertex));//录入顶点信息
adjlist[i].firstedge=NULL;//顶点的边表头指针设为空
adjlist[i].indegree=0;
}

for(k=0;k<e;k++) //建立边表
{
scanf("%d%d%d",&i,&j,&info);//录入有序偶对《vi,vj>及信息info
adjlist[j].indegree++;
s=(edgenode* )malloc(sizeof(edgenode));

s->adjvex=j;
s->info=info;
s->next=adjlist[i].firstedge;

adjlist[i].firstedge=s;

}

for(i=0;i<n;i++)
{
printf("adjlist[%d].indegree==%d ",i,adjlist[i].indegree);
s=adjlist[i].firstedge;
while(s)
{
printf("%d ",s->adjvex);
s=s->next;
}
printf("\n");
}
for(i=0;i<n;i++)
{
printf("%d ",i);
s=adjlist[i].firstedge;
while(s!=NULL)
{
printf("j==%d info==%d ",s->adjvex,s->info);
s=s->next;
}
printf("\n\n");
}
printf("\n");
}


int topsort(int tsort[],int n)
{//图用邻接表存储,顶点节点带入度域,求其拓扑序列,并存入tsort向量
edgenode *p;
int q[100],head,tail;
int m=0,i,j,k; //m为计数器,记录已输出得顶点数目

head=0;//初始化队列
tail=-1;

for(i=0;i<n;i++)//依次将入度为0的顶点入队
if(adjlist[i].indegree==0)
{
tail++;
q[tail]=i;
}

while(head<=tail)
{
j=q[head];//出队
head++;
tsort[m]=j; //点j进入拓扑序列中
m++;

p=adjlist[j].firstedge;
while(p)
{
k=p->adjvex;
adjlist[k].indegree--;
if(adjlist[k].indegree==0)//进队
{
tail++;
q[tail]=k;
}
p=p->next;
}
}
if(m<n)
{
printf("网络中有回路");
return 0;
}
else
{ for(i=0;i<n;i++)
printf("%d ",tsort[i]);
printf("\n");

return 1;
}
}

typedef struct
{
int data[100];
int top;
}stack;

int ve[100]={0},vl[100],e[100],l[100];
stack t;

int vertexelytinme(int n)
{
//t为拓扑序列顶点,s为入度顶点栈
//若图无回路,则用栈t返回图的拓扑序列,否则返回0;
int i,j,k,count;
edgenode *p;
stack s;
s.top=-1;
count=0;

for(i=0;i<n;i++)
if(adjlist[i].indegree==0)//将入度为0 的顶点入栈,
{
s.top++;
s.data[s.top]=i;
}
t.top=-1;

while(s.top!=-1)
{
j=s.data[s.top];
s.top--;
t.top++;
t.data[t.top]=j; //进入拓扑序列
count++; //计数进入拓扑序列的点

for(p=adjlist[j].firstedge;p;p=p->next)
{
k=p->adjvex;
adjlist[k].indegree --;
if(adjlist[k].indegree==0)
{
s.top++;
s.data[s.top]=k;
}

if((ve[j]+(p->info))>ve[k])//求得最大的ve[k]
{
ve[k]=ve[j]+(p->info);
}
}
}
if(count<n)
return 0;
else
{
for(i=0;i<n;i++)
printf("ve[%d]==%d ",i,ve[i]);
printf("\n");

return 1;
}
}

int pivotalpath(int n)//求AOE网的关键活动
{//图为AOE网,用邻接矩阵存储,求出图的各项关键活动

char tag;
int i,j,k,dut,e,l;
edgenode *p;
for(i=0;i<n;i++)
vl[i]=ve[n-1];
while(t.top!=-1)
{
j=t.data[t.top];
t.top--;

for(p=adjlist[j].firstedge;p;p=p->next)
{
k=p->adjvex;
if((vl[k]-(p->info)<vl[j]))//vl[j]取最小的
vl[j]=vl[k]-(p->info);
}
}

for(i=n-1;i>=0;i--)
printf("vl[%d]==%d ",i,vl[i]);
printf("\n\n");

printf("顶点1 顶点2 权值 最早 最迟 是否为关键活动\n");

for(j=0;j<n;j++)//求每个活动的最早和最迟开始时间,同时求出关键活动
{

for(p=adjlist[j].firstedge;p;p=p->next)
{
k=p->adjvex;
dut=p->info;
e=ve[j];
// printf("%d %d ",vl[k],dut);
l=vl[k]-dut;
// printf("e==%d l==%d\n",e,l);

if(e==l)
{
tag='*';//带“*”为关键活动
printf("%d->%d: %d %d %d %c\n",j,k,dut,e,l,tag);
}
}
}
return 1;
}


int main()
{ freopen("1.txt","r",stdin);
int n,e,i;
edgenode *s;
scanf("%d%d",&n,&e);
creatalgraph(n,e);
// topsort(tsort,n);
printf("\n");

vertexelytinme(n);
pivotalpath(n);

return 0;
}

分享到:
评论

相关推荐

    拓扑排序和关键路径的图形化显示.zip

    数据结构课程设计项目,邻接链表、关键路径以及拓扑排序的图形化显示,主要涉及到的技术有:前端、echarts、electron 给定一个有向图,完成: 建立并显示出它的邻接链表; 对该图进行拓扑排序,显示拓扑排序的结果,...

    数据结构图实验报告.doc

    " "(4)掌握图的其他运算 ,包括最小生成树,最短路径,拓扑排序和关键路径等算法。" "(5)灵活运用图这种数据结构解决一些综合应用问题。 " "二、实验内容和方法 " "(1)实验内容: " "1、编写一个程序algo8-1....

    c语言数据结构算法演示(Windows版)

    右下显示拓扑排序过程中入度为零的顶点的栈S,右上显示的栈 T 存放拓扑序列,其入栈顺序和栈 S 的出栈顺序相同,从栈顶到栈底的顶点顺序即为顶点的逆拓扑序列。算法执行结束后将弹出窗口列出全部结果,其中红色字体...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    12.1.4 求反运算 193 12.1.5 左移运算 193 1012.1.6 右移运算 193 12.2 位域(位段) 194 12.3 本章小结 13 文件 13.1 C文件概述 197 13.2 文件指针 198 13.3 文件的打开与关闭 199 13.3.1 文件的打开(fopen 函数) ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    12.1.4 求反运算 193 12.1.5 左移运算 193 1012.1.6 右移运算 193 12.2 位域(位段) 194 12.3 本章小结 13 文件 13.1 C文件概述 197 13.2 文件指针 198 13.3 文件的打开与关闭 199 13.3.1 文件的打开(fopen 函数) ...

    用c描述的数据结构演示软件

     关键路径(Critical_path) (4)求最小生成树  普里姆算法(Prim)  克鲁斯卡尔算法(Kruscal) (5)求关节点和重连通分量(Get_artical) (6)求最短路径  弗洛伊德算法(shortpath_Floyd)  迪杰斯特拉算法...

    数据结构演示软件

    数据结构算法演示(Windows版...窗口下方显示图的邻接表,演示过程中以红色框边表示已访问过的弧。图示窗口的下方显示遍历后输出的顶点序列。 22. 图的广度优先搜索 与深度优先不同的是,在窗口的下方增加一个队列,...

    数据结构(C++)有关练习题

    4、用邻接矩阵或邻接图实现一个有向图的存储,并实现单源最短路径算法的实现(这个类的一个成员函数),并能输出该图的关键路径。 注:1、要用面向对象的方法设计代码; 2、一个图是一个类的实例; 3、类...

Global site tag (gtag.js) - Google Analytics