1 条题解

  • 0
    @ 2025-2-21 19:54:32

    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
    上传者