5-10 公路村村通 (30分) prim Kruskal 算法

5-10 公路村村通 (30分) prim Kruskal 算法_第1张图片5-10 公路村村通 (30分) prim Kruskal 算法_第2张图片5-10 公路村村通 (30分) prim Kruskal 算法_第3张图片


Prime  难点 更新Lowcost 数组

#include<iostream>
#include "string.h"
using  namespace std;
#define MAX 1005

int G[MAX][MAX];
int Top; 
int Prime()
{
    int sum=0,  count=0;
 
    int  Lowcost[MAX];
    
    memset(Lowcost,0,sizeof(Lowcost));
    int i,j;
    for(i=1;i<=Top;i++)
    {
		Lowcost[i]=G[1][i];
    }
    Lowcost[1]=-1;
	
	for(i=1;i<Top;i++)
	{
        int min=inf,k=-1;
        for(j=1;j<=Top;j++)
        {
			if(Lowcost[j]<min && Lowcost[j]!=-1  )
			{
				min=Lowcost[j];
				k=j;
			}
        }
		if(k!=-1)
		{
			sum+=Lowcost[k];
	    	Lowcost[k]=-1;
			for(j=1;j<=Top;j++)
			{
			  if(G[k][j]<Lowcost[j])
			  {
				  Lowcost[j]=G[k][j];
			  }
			}        
        }
		
    }
	
    for(i=1;i<=Top;i++)
    if(Lowcost[i]!=-1)
 	break;
		
  	if(i<=Top)
  	return  -1;
		
		
    return sum;
}

int main()
{
    int i, j, m, n;
    int x,y,w;
 
    //freopen("1.txt","r",stdin);
    cin >> m >> n;//m=顶点的个数,n=边的个数
    if(m<=0)
    {
        cout<<"-1"<<endl;
        return 0;
    }
    
            for(i=1; i<=m; i++)
            for(j=1; j<=m; j++)
                if(i==j) G[i][j]=0;
                else G[i][j]=inf;
	
    Top=m;
    for(i=0;i<n;i++)
    {
		cin>>x>>y>>w;
		G[x][y]=w;
		G[y][x]=w;
    }
    
	
    
    cout<<Prime()<<endl;
	
	
	
    return 0;
}

并查集    Krusual 算法

 #include "iostream"
#include "algorithm"
#include "string.h"
using  namespace std;

#define  Max 1005
int Father[Max];
struct Node
{
	int priority;
    int next;
	int weight;
}A[3005];
bool Com(Node X,Node Y)
{
    return X.weight<Y.weight;
}
int Find(int x) //查
{
     if(x==Father[x])
	 return x;
	 else
     return  Find(Father[x]) ;
}
bool Union(int x,int y)  //并
{
    int dx,dy;
    dx=Find(x);
	dy=Find(y);
	if(dx!=dy)
	{
		Father[dx]=dy;
		return true;
	}
    return false;
}
 
int main() 
{
     
	 //freopen("1.txt","r",stdin);
	 int m,n;
     cin>>m>>n;  // Top, Edge	 
	 int i;
     for(i=1;i<=m;i++)
	 {
		 Father[i]=i;
	 }
	 for(i=1;i<=n;i++)
	 { 
		 cin>>A[i].priority>>A[i].next>>A[i].weight;
      
	 }	     
     sort(A,A+n,Com);
     int count=m;
     int sum=0; 
	 for(i=1;i<=n && count>1;i++)
	 {
          if(   Union(A[i].priority,A[i].next) )
		  {
            sum+=A[i].weight;
			count--;
		  }
	 }
     if(count==1)
     cout<<sum<<endl;
	 else
	 cout<<"-1"<<endl;


    return 0;
}




你可能感兴趣的:(5-10 公路村村通 (30分) prim Kruskal 算法)