Example #1
0
//采用邻接矩阵表示法创建有向网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;		//图的类型为有向网
}
Example #2
0
//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);
}
Example #3
0
 /*在图中插入一条边
 参数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);
}
Example #5
0
//利用普里姆算法求从第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;
			}
	}
}