#define Infinity 1000000 typedefstructedge { int id; int adjvex; int weight; structedge *link; } Edge, *Edgeprt; typedefstructnode { int data; Edgeprt link; } Node, *Nodeprt; Nodeprt G[205]; int edge_to_weight[205];
voidinsert_edge(int ID, int a, int b, int wei) { Edgeprt p = (Edgeprt) malloc(sizeof(Edge)); p->id = ID; p->weight = wei; p->adjvex = b; p->link = NULL; if (G[a] == NULL) { G[a] = (Nodeprt) malloc(sizeof(Node)); G[a]->link = p; } else { Edgeprt q = G[a]->link; for (; q->link != NULL; q = q->link); q->link = p; } }
voidprim(int dis[], int src, int edges[], int n) { //初始化 Edgeprt p = G[src]->link; for (int i = 0; i < n; i++) { dis[i] = Infinity; } for (; p != NULL; p = p->link) { dis[p->adjvex] = p->weight; edges[p->adjvex] = p->id; } dis[src] = 0; for (int i = 1; i < n; i++) { int min = Infinity; int k = 0; for (int j = 0; j < n; j++) { if (dis[j] != 0 && dis[j] < min) { min = dis[j]; k = j; } } //找到了最近的k号结点 dis[k] = 0;//k到生成树的距离为0 p = G[k]->link; for (; p != NULL; p = p->link) { if (dis[p->adjvex] != 0 && p->weight < dis[p->adjvex]) { dis[p->adjvex] = p->weight; edges[p->adjvex] = p->id; } } } }
intcmp(constvoid *e1, constvoid *e2) { int p1 = *(int *) e1; int p2 = *(int *) e2; if (p1 > p2)return1; elseif (p1 < p2)return-1; elsereturn0; }
intmain() { //freopen("a.in", "r", stdin); //freopen("a.out", "w", stdout); int num_node, num_edge; scanf("%d%d", &num_node, &num_edge); int id, a, b, wei; for (int i = 1; i <= num_edge; i++) { scanf("%d%d%d%d", &id, &a, &b, &wei); insert_edge(id, a, b, wei); insert_edge(id, b, a, wei); edge_to_weight[id] = wei; } int edges[205] = {0}; int dis[205] = {0}; prim(dis, 0, edges, num_node); //edges里面存着边序号, int sum = 0; for (int i = 0; i < num_node; i++) { sum += edge_to_weight[edges[i]]; } //实际上只有num_node-1条边,但是由于edges[0]=0无法改变,倒置所有边的下标要后移一位,从1~num_node-1的下标, qsort(edges, num_node, sizeof(edges[0]), cmp); printf("%d\n", sum); for (int i = 1; i < num_node; i++) { printf("%d ", edges[i]); } return0; }
#define Infinity 1000000 typedefstructnode { int data; structnode *link; } Node, *Nodeprt; int weight[105][105]; int edge[105][105]; int edge_to_weight[205];
voidprim(int src, int n, int edges[]) { int dis[205], k; for (int i = 0; i < n; i++) { dis[i] = Infinity; } dis[src] = 0;//加入生成树 for (int i = 1; i < n; i++) { if (weight[src][i] != 0) { dis[i] = weight[src][i]; edges[i] = edge[src][i]; } } for (int i = 1; i < n; i++) { int min = Infinity; for (int j = 0; j < n; j++) { if (dis[j] != 0 && dis[j] < min) { min = dis[j]; k = j; } } dis[k] = 0; for (int i = 0; i < n; i++) { if (dis[i] != 0 && weight[k][i] != 0 && weight[k][i] < dis[i]) { dis[i] = weight[k][i]; edges[i] = edge[k][i]; } } } }