#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;
}
鄰接表實現 prim
思路很簡單,就是每次選取不在生成樹中的權值最小的邊加入到生成樹中。使用了兩個結構體,一個鏈表,一個節點數組。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.