关键路径.docx
- 文档编号:27867576
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:13
- 大小:107.09KB
关键路径.docx
《关键路径.docx》由会员分享,可在线阅读,更多相关《关键路径.docx(13页珍藏版)》请在冰豆网上搜索。
关键路径
关键路径
运行图:
源代码:
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
return0;
}
#include
#include
#include
#defineMAXVEX100
#defineINFINITY65535
typedefcharVType;
typedefintEType;
typedefstructENode{
intadjvex;
ETypeweight;
structENode*next;
}ENode;
typedefstructVNode{
intin;
VTypedata;
ENode*FirstEdge;
}VNode,AdjList[MAXVEX];
typedefstruct{
AdjListAL;
intNumV,
NumE;
}GraphAdjList,*GraphAdjList_p;
int*etv,
*ltv,
*stack2,
top2;
voidCreateALGraph(GraphAdjList*GL)
{
inti,
j,
k,
w,
in;
ENode*e;
printf("输入顶点数和边数:
\n");
scanf_s("%d,%d",&GL->NumV,&GL->NumE);
printf("依次输入各顶点信息(字符)\n");
for(i=0;i
fflush(stdin);
scanf_s("%c",&GL->AL[i].data);fflush(stdin);
GL->AL[i].FirstEdge=NULL;
}
for(k=0;k
printf("输入第%d边(Vi,Vj)上的下标i,j和权w(用逗号分开):
\n",k+1);
scanf_s("%d,%d,%d",&i,&j,&w);
e=(ENode*)malloc(sizeof(ENode));
e->adjvex=j;
e->weight=w;
e->next=GL->AL[i].FirstEdge;
GL->AL[i].FirstEdge=e;
}
for(k=0;k
printf("输入顶点V%c的入度:
",GL->AL[k].data);
fflush(stdin);
scanf_s("%d",&in);fflush(stdin);
GL->AL[k].in=in;
}
}
voidAuto_CreateGraphAdjList(GraphAdjList*GL,intx,inty)
{
inti,
j,
k,
w,
*a;
ENode*e;
srand((int)time(NULL));
GL->NumV=x;
GL->NumE=y;
a=(int*)malloc(sizeof(int)*x*x);
for(i=0;i GL->AL[i].data=(char)(48+i); GL->AL[i].FirstEdge=NULL; } for(i=0;i for(j=0;j a[i*x+j]=INFINITY; for(k=0;k do{ i=rand()%x; j=rand()%x; w=rand()%20+1; }while(a[i*x+j]! =INFINITY||i>=j||j-i>3); a[i*x+j]=w; }/* do{ flag=0; for(k=0;k do{ i=rand()%x; j=rand()%x; w=rand()%15+1; }while(a[i*x+j]! =INFINITY||i>=j||j-i>3); a[i*x+j]=w; } for(k=0;k s1=s2=0; for(i=0;i if(a[i*x+k]==INFINITY) ++s1; } if(s1==k&&k! =0){ flag=1; k=x; break; } for(j=k+1;j if(a[k*x+j]==INFINITY) ++s2; } if(s2==x-1-k&&k! =x-1){ flag=1; k=x; break; } } }while(flag=1);*/ for(i=0;i for(j=i+1;j if(a[i*x+j]! =INFINITY){ e=(ENode*)malloc(sizeof(ENode)); e->adjvex=j; e->weight=a[i*x+j]; e->next=GL->AL[i].FirstEdge; GL->AL[i].FirstEdge=e; } for(j=0;j k=0; for(i=0;i<=j-1;i++) if(a[i*x+j]! =INFINITY) ++k; GL->AL[j].in=k; } } intTopologicalSort(GraphAdjList*GL) { inti, k, gettop, top=0, count=0, *stack; ENode*e; stack=(int*)malloc(GL->NumV*sizeof(int)); for(i=0;i if(GL->AL[i].in==0) stack[++top]=i; top2=0; etv=(int*)malloc(GL->NumV*sizeof(int)); for(i=0;i etv[i]=0; stack2=(int*)malloc(GL->NumV*sizeof(int)); printf("\n<拓扑排序>: \n\n"); while(top! =0){ gettop=stack[top--]; printf("%c->",GL->AL[gettop].data); stack2[++top2]=gettop; count++; for(e=GL->AL[gettop].FirstEdge;e;e=e->next){ k=e->adjvex; if(! (--GL->AL[k].in)) stack[++top]=k; if((etv[gettop]+e->weight)>etv[k]) etv[k]=etv[gettop]+e->weight; } } printf("\n\n"); if(count return0; else return1; } voidCriticalPath(GraphAdjList*GL) { inti, j, k, ete, lte, gettop; ENode*e; TopologicalSort(GL); ltv=(int*)malloc(GL->NumV*sizeof(int)); for(i=0;i ltv[i]=etv[GL->NumV-1]; while(top2! =0){ gettop=stack2[top2--]; for(e=GL->AL[gettop].FirstEdge;e;e=e->next){ k=e->adjvex; if((ltv[k]-e->weight) ltv[gettop]=ltv[k]-e->weight; } } printf("<关键路径>: \n\n"); for(j=0;j for(e=GL->AL[j].FirstEdge;e;e=e->next){ k=e->adjvex; ete=etv[j]; lte=ltv[k]-e->weight; if(ete==lte) printf(" %2d\n",GL->AL[j].data,GL->AL[k].data,e->weight); } } voidshow() { printf("____________________________________\n"); printf("____________________________________\n"); printf("\n"); printf("有向图——邻接表\n"); printf("\n"); printf("1.拓扑排序\n"); printf("\n"); printf("2.关键路径\n"); printf("____________________________________\n"); printf("_____________________________________\n"); } voidprint(GraphAdjList*GL) { inti, j, *a; ENode*e; a=(int*)malloc(sizeof(int)*GL->NumV*GL->NumV); for(i=0;i for(j=0;j a[i*GL->NumV+j]=INFINITY; for(i=0;i for(e=GL->AL[i].FirstEdge;e;e=e->next){ j=e->adjvex; a[i*GL->NumV+j]=e->weight; } printf("该图为: \n"); for(i=0;i printf("%5c",GL->AL[i].data); printf("\n\n"); for(i=0;i printf("%5c",GL->AL[i].data); for(j=0;j if(a[i*GL->NumV+j]==INFINITY) printf("-"); else printf("%5d",a[i*GL->NumV+j]); printf("\n"); } } intmain() { intk,k1,k2,i,j,x,y; GraphAdjListGL; while (1){ system("cls"); show(); do{ printf("请选择有向图的生成方式: \n" "1.自动生成\n" "2.手动生成\n"); scanf_s("%d",&k); fflush(stdin); }while(k! =1&&k! =2); if(k==1){ do{ printf("请输入顶点数和边数(逗号分开): "); fflush(stdin); scanf_s("%d,%d",&i,&j);fflush(stdin); for(y=0,x=1;x y+=x; }while(j>y); do{ Auto_CreateGraphAdjList(&GL,i,j); system("cls"); print(&GL); printf("该图是否合适? \n\n不合适请输入0重新生成,否则继续"); fflush(stdin); scanf_s("%d",&k1); fflush(stdin); }while(k1==0); } else{ CreateALGraph(&GL); system("cls"); print(&GL); } CriticalPath(&GL); printf("\n\n输入0退出,否则继续~");scanf_s("%d",&i); if(i==0) exit(0); } } 注: 此程序为MicrosoftVisualStudio2012编译,执行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关键 路径