题意:求一个连通图的最小生成树。
题解:prim
prim与dijkstra的区别是dis[i]存的是生成过程与第i个点的最短边而不是最短距离。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
int n ;
int map1[30][30] ;
void prim()
{
int i , j , k ;
bool vis[30] ;
int dis[30] ;
int min1 , temp ;
int ans ;
memset(vis , 0 , sizeof(vis)) ;
memset(dis , inf , sizeof(dis)) ;
vis[0] = 1 ;
dis[0] = 0 ;
for(i = 1 ; i < n ; i ++)
dis[i] = map1[0][i] ;
for(i = 1 ; i < n ; i ++)
{
min1 = inf ;
for(j = 1 ; j < n ; j ++)
{
if(!vis[j] && dis[j] < min1)
{
min1 = dis[j] ;
temp = j ;
}
}
vis[temp] = 1 ;
for(j = 1 ; j < n ; j ++)
if(!vis[j] && dis[j] > map1[temp][j])
dis[j] = map1[temp][j] ;
}
ans = 0 ;
for(i = 0 ; i < n ; i ++)
ans += dis[i] ;
printf("%d\n" , ans) ;
}
int main()
{
int i , j , k ;
int u , v , w ;
char s1[10] , s2[10] ;
while(scanf("%d" , &n) && n != 0)
{
memset(map1 , inf , sizeof(map1)) ;
for(i = 0 ; i < n - 1 ; i ++)
{
scanf("%s%d" , s1 , &k) ;
u = s1[0] - 'A' ;
for(j = 0 ; j < k ; j ++)
{
scanf("%s%d" , s2 , &w) ;
v = s2[0] - 'A' ;
map1[u][v] = map1[v][u] = w ;
}
}
prim() ;
}
}