1 条题解

  • 0
    @ 2025-11-30 16:28:08

    C :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define maxn 110
    #define INF 1000000000
    
    int G[maxn][maxn];
    int dp[maxn];
    int vis[maxn];
    int n;
    
    int prime(){
    memset(vis,0,sizeof(vis));
    for(int i = 0;i <= n; i++)dp[i] = INF;
    dp[1] = 0;
    int ans = 0;
    for(int i = 1;i <= n; i++){
        int u = -1, MIN = INF;
        for(int j = 1;j <= n; j++){
            if(vis[j]==0 && dp[j] < MIN){
                u = j;
                MIN = dp[j];
            }
        }
        vis[u] = 1;
        ans += MIN;
        for(int v = 1;v <= n; v++){
            if(vis[v]==0 && G[u][v] != 0 && dp[v] > G[u][v]){
                dp[v] = G[u][v];
            }
        }
    }
    return ans;
    }
    
    int main()
    {
        while(scanf("%d",&n) != EOF){
            memset(G,0,sizeof(G));
            for(int i = 1;i <= n; i++){
                for(int j = 1;j <= n; j++){
                    scanf("%d",&G[i][j]);
                }
            }
            printf("%d\n",prime());
        }
        return 0;
    }
    

    C++ :

    #include<iostream>
    #include<cstring>
    using namespace std;
    int n,f,sum=0;
    int fei[110][110],dis[110];
    int main()
    {
    	memset(fei,0x7f,sizeof(fei));
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			cin>>f;
    			if(f!=0)
    			fei[i][j]=f;
    		}
    	}
    	sum=0;//记录造价
    	int x=2;
    	for(int i=1;i<=n;i++) dis[i]=fei[x][i];//把x放入已选集合,更新其他点到x的距离 
    	dis[x]=0;//x到自己的距离为0,这个很重要,容易忽视 
    	for(int i=2;i<=n;i++)//只需要找到n-1条边就可以形成一棵最小生成树 
    	{
    		int min=0x7f7f7f7f,k;//min找最短的符合要求的边,k记录边的另一节点 
    		for(int j=1;j<=n;j++)//枚举每一个点,找离已选点最近的边 
    		{
    			if(dis[j]<min && dis[j]!=0)//dis[j]=0表示j点已选 
    			{
    				min=dis[j];
    				k=j;
    			}
    		}
    	sum+=dis[k];
    		dis[k]=0;//dis[k]设为0,表示k点一进入已选点 
    		for(int j=1;j<=n;j++)//更新其他点到k点的距离 
    		{
    			if(dis[j]>fei[k][j]) dis[j]=fei[k][j];
    		}
    	}
    	cout<<sum<<endl;
    	/*
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			cout<<fei[i][j]<<' ';
    		}
    		cout<<endl;
    	}*/
    	return 0;
    }
    
    • 1

    信息

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