鄰接表實現 prim

思路很簡單,就是每次選取不在生成樹中的權值最小的邊加入到生成樹中。使用了兩個結構體,一個鏈表,一個節點數組。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#define MAX 100000000

using namespace std;
struct link
{
	int a;
	int value;
	link* next;
};

struct node
{
	int know;
	int dis;
	struct link head;
}nodes[ 1010 ];

void creat( int, int, int );
void Init();
void Dist();
int SmallVertex();

int N,M,P,Q;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		Init();
		scanf("%d%d",&M,&P);
		for( int i=0;i<P;i++ )
		{
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			creat(a,b,c);
			creat(b,a,c);
		}
		nodes[1].dis=0;
		Dist();
		int sum=0;
		for( int i=1;i<=M;i++ )
            		sum+=nodes[ i ].dis;
       		int Max=MAX;
        	for( int i=0;i<M;i++ )
        	{
          	  int a;
          	  scanf("%d",&a);
          	  if( Max>a )
           	 Max=a;
     	   }
      	  printf("%d\n",Max+sum);
	}
	return 0;
}

void Init()
{
	for( int i=0;i<1010;i++ )
	{
		nodes[i].head.next=NULL;
		nodes[i].know=0;
		nodes[i].dis=MAX;
	}

}
void creat(int a,int b,int c)
{
	struct link* p=(struct link*)malloc(sizeof(struct link));
	p->a=b;
	p->value=c;
	p->next=nodes[a].head.next;
	nodes[a].head.next=p;
}

void Dist()
{
	for(;;)
	{
		int V=SmallVertex();
		if( V==-1 ) break;
		nodes[V].know=1;
		struct link* p=nodes[V].head.next;
		while( p != NULL )
		{
		    if( !nodes[ p->a ].know )
		        if( p->value < nodes[p->a].dis )
                    nodes[ p->a ].dis = p->value;
            p=p->next;
		}
	}
}

int SmallVertex()
{
    int min=MAX,vertex=-1;
    for( int i=1;i<=M;i++ )
    {
        if( !nodes[ i ].know&&min>nodes[ i ].dis )
        {
            min=nodes[ i ].dis;
            vertex=i;
        }
    }
       return vertex;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章