#include <stdio.h>
#include <stdlib.h>
#define mvnum 100 //最大顶点个数
#define MaxInt 36767 //代表无穷
typedef int vexType; //顶点数据类型
typedef int edgeType; //边的数据类型
//邻接矩阵
typedef struct Graph{
vexType vertex[mvnum]; //点集
edgeType edge[mvnum][mvnum]; //边集
int vexnum, edgenum; //顶点个数,边的个数
}Graph;
void CreateGraph(Graph *G); //创建无向网
int LocateVex(Graph *G, int v); //顶点的定位
void Traverse(Graph *G); //网的遍历
void CreateGraph(Graph *G){
printf("顶点个数:");
scanf("%d", &G->vexnum);
printf("边数:");
scanf("%d", &G->edgenum); //确定该网的顶点个数与边数
printf("点集:");
for(int i = 0; i < G->vexnum; ++i){
scanf("%d", &G->vertex[i]); //对顶点进行赋值
}
for(int i = 0; i < G->vexnum; ++i){
for(int j = 0; j < G->vexnum; ++j){
G->edge[i][j] = MaxInt; //因为是网,所以先提前把每两个顶点之间的边的权值设为无穷大
}
}
printf("构建无向网\n");
for(int k = 0; k < G->edgenum; ++k){
vexType v1, v2;
edgeType w;
scanf("%d%d%d", &v1, &v2, &w); //输入想要添加的边的权值以及边所依附的两顶点
if(w != 0){
int i = LocateVex(G, v1), j = LocateVex(G, v2); //确定两顶点在图中的位置
G->edge[i][j] = w;
G->edge[j][i] = G->edge[i][j]; //由于无向网具有对称性,因此可以对称赋值
}
}
}
int LocateVex(Graph *G, int v){
for(int i = 0; i < G->vexnum; ++i){
if(v == G->vertex[i]) return i;
}
return -1;
}
void Traverse(Graph *G){
for(int i = 0; i < G->vexnum; ++i){
for(int j = 0; j < G->vexnum; ++j){
if(G->edge[i][j] != MaxInt){
printf("%d ", G->edge[i][j]);
}else{
printf("%d ", MaxInt);
}
}
}
}
int main(){
Graph g;
CreateGraph(&g);
Traverse(&g);
return 0;
}