1 条题解

  • 0
    @ 2024-12-24 9:54:33

    C :

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int g[105][105]; //邻接矩阵
    int minn[105];    //minn[i]存放顶点i与生成树相连的最小边权
    int start[105];    //start[i]存放与minn[i]的顶点i相关联的顶点
    int u[105];         //u[i]=1表示顶点i还未加入到生成树中,u[i]=0表示顶点i已加入到生成树中
    int n,e,total;
    
    void prim(){
    	int i,j,k;
        memset(minn,0x7f,sizeof(minn));//初始化为maxint
        minn[1] = 0; start[1]=0;             //开始的顶点
        memset(u,1,sizeof(u));              //初始化为1,表示所有顶点未加入生成树
    	for (i = 1; i <= n; i++)               //需加入n个顶点
        {
            k = 0;
            for (j = 1; j <= n; j++)     //找一个与生成树相连的权值最小的顶点k
                if (u[j] && (minn[j] < minn[k]))
                    k = j;
            u[k] = 0;                         //顶点k加入生成树
    		total=total+minn[k];
            for (j = 1; j <= n; j++)     //修改与k相连的所有边
                if (u[j] &&(g[k][j]!=0) && (g[k][j] < minn[j]))
    				{	minn[j] = g[k][j];  
    					start[j]=k; 
    				}
        } 
    }
    
    int main(){
    	int i,j,w,t=0;
    	scanf("%d%d",&n,&e);
        while (e>0) {
    		scanf("%d%d%d",&i,&j,&w);
    		g[i][j]=g[j][i]=w;
    		t=t+w;
    		e--;
    	}
    	prim();
    	printf("%d\n",t-total);
        return 0;
    }
    
    
    • 1

    信息

    ID
    1234
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者