7 solutions

  • 0
    @ 2023-1-4 17:12:34

    看大家发的都是kruskal算法的,那我发个prim算法的吧,我觉得prim算法适合这道题这种稠密图的情况

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define inf 0x3f3f3f3f
    #define v_n 2021
    int w_m[2021][2021];
    
    int sideWeight(int x,int y)
    {
    	int sum_w=0;
    	while(x!=0||y!=0)
    	{
    		if(x%10!=y%10)//a和b相同位数下的数字不同 
    		{
    			sum_w+=x%10;
    			sum_w+=y%10;
    		}
    		x/=10;
    		y/=10;
    	}
    	return sum_w;
    }
    int prim()
    {
        bool is_visited[v_n]={0};
        int dis[v_n],sum_w=0;
        for(int i=0;i<v_n;++i)
        {
        	dis[i]=w_m[0][i];
    	}
    	is_visited[0]=1;
    	for(int i=0;i<v_n-1;++i)
    	{
    		int min_w=inf,min_v=-1;
    		for(int j=0;j<v_n;++j)
    		{
    			if(is_visited[j]==0&&dis[j]<min_w)//prim算法的核心是每次从没添加到生成树的节点中寻找到生成树最近的节点添加到生成树中 
    			{
    				min_w=dis[j];
    				min_v=j;
    			}
    		}
    		for(int j=0;j<v_n;++j)
    		{
    			dis[j]=min(dis[j],w_m[min_v][j]);
    		}
    		is_visited[min_v]=1;
    		sum_w+=min_w;
    	}
        return sum_w;
    }
    int main()
    {
        for(int i=0;i<v_n;++i)
        {
            for(int j=0;j<v_n;++j)
            {
                w_m[i][j]=sideWeight(i,j);//生成图的权值矩阵 
            }
            w_m[i][i]=0;
        }
        cout<<prim()<<endl;
    }
    

    Information

    ID
    108
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    6
    Tags
    # Submissions
    122
    Accepted
    41
    Uploaded By