1 条题解
-
0
C :
#include<stdio.h> #define MAX_VERTEX_NUM 100 int parent[MAX_VERTEX_NUM]; typedef struct { int weight; int begin; int end; }Edge; int Find(int *parent,int f) { while(parent[f]>0) f=parent[f]; return f; } int main() { int N,num,k=0,sum=0,m,n; Edge edges[MAX_VERTEX_NUM*MAX_VERTEX_NUM],temp; scanf("%d",&N); for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { scanf("%d",&num); if(num!=0&&i<j) { edges[k].weight=num; edges[k].begin=i; edges[k].end=j; k++; } } } for(int i=0;i<k;i++) { for(int j=i;j<k;j++) { if(edges[i].weight>edges[j].weight) { temp.weight=edges[i].weight; temp.begin=edges[i].begin; temp.end=edges[i].end; edges[i].weight=edges[j].weight; edges[i].begin=edges[j].begin; edges[i].end=edges[j].end; edges[j].weight=temp.weight; edges[j].begin=temp.begin; edges[j].end=temp.end; } } } for(int i=0;i<N;i++) { parent[i]=0; } for(int i=0;i<k;i++) { n=Find(parent,edges[i].begin); m=Find(parent,edges[i].end); if(n!=m) { parent[n]=m; sum+=edges[i].weight; } } printf("%d\n",sum); return 0; }
C++ :
#include <cstdio> #include <cstdlib> const int MAXN = 50; // 最大顶点数 const int INF = 1000000000; // 作为标记的无穷大值 int mat[MAXN][MAXN]; // 无向图的邻接矩阵 int mind[MAXN]; // 辅助数组 int v[MAXN]; // 标记顶点是否被访问过的数组 int n; // 顶点的个数 int prim() { int ret = 0, i, j, k; for (i = 0; i<n; i++) { mind[i] = INF; v[i] = 0; } for (mind[j = 0] = 0; j < n; j++) { for (k = -1, i = 0; i < n; i++) { if (!v[i] && (k == -1 || mind[i] < mind[k])) { k = i; } } v[k] = 1; ret += mind[k]; for (i = 0; i < n; i++) { if (!v[i] && mat[k][i] < mind[i]) { mind[i] = mat[k][i]; } } } return ret; } int main() { scanf("%d", &n); for (int i = 0;i < n;i++) { // 读入无向图的邻接矩阵 for (int j = 0;j < n;j++) { scanf("%d", &mat[i][j]); if (mat[i][j] == 0) mat[i][j] = INF; } } printf("%d\n", prim()); return 0; }
Pascal :
program p1765; var cost:array[1..50,1..50]of longint; mincost,closed:array[1..50]of longint; min,k,i,j,n,x,y,sum:longint; begin readln(n); for i:=1 to n do for j:=1 to n do begin read(cost[i,j]); if(i<>j) and(cost[i,j]=0)then cost[i,j]:=maxint; end; sum:=0; for i:=1 to n do begin mincost[i]:=cost[1,i]; closed[i]:=1; end; for i:=2 to n do begin min:=maxint; for j:=1 to n do if(mincost[j]<min)and(mincost[j]<>0)then begin min:=mincost[j]; k:=j; end; sum:=sum+min; mincost[k]:=0; for j:=1 to n do if(mincost[j]>cost[k,j])and(mincost[j]<>0) then begin mincost[j]:=cost[k,j]; closed[j]:=k; end; end; writeln(sum); end.
Java :
import java.util.Scanner; public class Main { /** * 4 * 0 2 4 0 * 2 0 3 5 * 4 3 0 1 * 0 5 1 0 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int n = in.nextInt(); int[][] weight = new int[n][n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { weight[i][j] = in.nextInt(); } } Prim prim = new Prim(n); MinTree minTree = new MinTree(); minTree.create(n, prim, weight); minTree.prim(prim, 0); } private static class MinTree{ public int[] visited; public int len; public void create(int vertx, Prim prim, int[][] weight) { this.len = vertx; this.visited = new int[len]; prim.weight = weight; } public void prim(Prim prim, int v) { this.visited = new int[len]; visited[v] = 1; int min; int t = -1; int res = 0; for (int i = 1; i < len; i++) { min = Integer.MAX_VALUE; for (int j = 0; j < len; j++) { for (int k = 0; k < len; k++) { if (prim.weight[j][k] != 0 && visited[j] == 1 && visited[k] == 0 && prim.weight[j][k] < min) { t = k; min = prim.weight[j][k]; } } } if (t != -1) { visited[t] = 1; res += min; } } System.out.println(res); } } private static class Prim{ int[][] weight; int vertx; public Prim(int vertx) { this.vertx = vertx; this.weight = new int[vertx][vertx]; } } }
- 1
信息
- ID
- 978
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者