//采用邻接矩阵表示法创建有向网N void CreateGraph(MGraph *N){ int i,j,k,w,InfoFlag,len; char s[MaxSize]; VertexType v1,v2; printf("请输入有向网N的顶点数,弧数,弧的信息(是:1,否:0): "); scanf("%d,%d,%d",&(*N).vexnum,&(*N).arcnum,&InfoFlag); printf("请输入%d个顶点的值(<%d个字符):\n",N->vexnum,MaxSize); for(i=0;i<N->vexnum;++i) //保存网的各个顶点 scanf("%s",N->vex[i]); for(i=0;i<N->vexnum;i++) //初始化邻接矩阵 for(j=0;j<N->vexnum;j++){ N->arc[i][j].adj=INFINITY; N->arc[i][j].info=NULL; //弧的信息初始化为空 } printf("请输入%d条弧的弧尾 弧头 权值(以空格作为间隔): \n",N->arcnum); for(k=0;k<N->arcnum;k++){ scanf("%s%s%d",v1,v2,&w); //输入两个顶点和弧的权值 i=LocateVertex(*N,v1); j=LocateVertex(*N,v2); N->arc[i][j].adj=w; if(InfoFlag){ //如果弧包含其它信息 printf("请输入弧的相关信息: "); gets(s); len=strlen(s); if(len){ N->arc[i][j].info=(char *)malloc((len+1)*sizeof(char)); strcpy(N->arc[i][j].info,s); } } } N->kind=DN; //图的类型为有向网 }
//insert at the head of the list ptrGraph AddEdge(ElemType head, ElemType tail, ptrGraph G) { ptrEdgeNode edge; int h; edge = malloc(sizeof(EdgeNode)); if(edge == NULL){ FatalError("Out of space."); } edge->adjvex = LocateVertex(tail, G); (G->adjList[edge->adjvex].indegree)++; h = LocateVertex(head, G); edge->next = G->adjList[h].firstedge; //insert at the head G->adjList[h].firstedge = edge; (G->numEdges)++; return (G); }
/*在图中插入一条边 参数vex1、vex2为要插入边的两个顶点的值;参数wgh为欲插入边的权值,默认值为0*/ bool WPin::Insertedge(const string &vex1, const string &vex2, float wgh) { // 找到两个顶点在顶点表中的序号,分别赋值给v1、v2 // 两个顶点中只要有一个在图的顶点表中未找到,则返回 int v1 = LocateVertex(vex1); int v2 = LocateVertex(vex2); if (v1 == -1 || v2 == -1) return false; // 为第一个顶点的邻接表中增加一条边 bool a = vertices[v1].Appendedge(v2, wgh); // 无向图,则必须在另一顶点的邻接表中增加一条边 bool b = vertices[v2].Appendedge(v1, wgh); if (a && b) { numedges++; return true; } else return false; }
int CreteUDG(AdjMatrix *G) { int i,j,weight; int k; VertexData v1,v2; scanf("%d%d",&G->vexnum,&G->arcnum); for(i=0;i<G->arcnum;i++) for(j=0;j<G->arcnum;j++) G->arcs[i][j].adj=INFINITY; for(i=0;i<G->arcnum;i++) scanf("%d",&G->vexs[i]); for(k=0;k<G->vexnum;k++) { scanf("%d%d%d",&v1,&v2,&weight); i=LocateVertex(G,v1); j=LocateVertex(G,v2); G->arcs[i][j].adj=weight; } return(OK); }
//利用普里姆算法求从第u个顶点出发构造网G的最小生成树T void Prim(MGraph G,VertexType u){ int i,j,k; closeedge closedge; k=LocateVertex(G,u); //k为顶点u对应的序号 for(j=0;j<G.vexnum;j++){ //数组初始化 strcpy(closedge[j].adjvex,u); closedge[j].lowcost=G.arc[k][j].adj; } closedge[k].lowcost=0; //初始时集合U只包括顶点u printf("无向网的最小生成树的各条边分别是:\n"); for(i=1;i<G.vexnum;++i){ //选择剩下的G.vexnum-1个顶点 k=MiniNum(closedge,G); //k为与U中顶点相邻接的下一个顶点的序号 printf("(%s-%s)\n",closedge[k].adjvex,G.vex[k]); //输出生成树的边 closedge[k].lowcost=0; //第k顶点并入U集 for(j=0;j<G.vexnum;++j) if(G.arc[k][j].adj<closedge[j].lowcost){ //新顶点加入U集后重新将最小边存入到数组 strcpy(closedge[j].adjvex,G.vex[k]); closedge[j].lowcost=G.arc[k][j].adj; } } }