Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 3968 Accepted
Submission(s): 2888
最小生成树 ,解法一 普利姆算法...
做了这么多不妨做一个总结ba 。 关于普利姆算法
普利姆一般用于连续的点...(密集型的结构图)。
通过这个p大家可能会看的比较明白....
比如 第二个样列
3
A 2 B 10 C 40
B 1 C 20 a-->(b-->c ,c) 对于这样一个图,随机从一点出发... 米前景一步变求一次最小,,,
于是 觉得用代码更有说服力。。。毕竟要说明白也很花时间,.
代码:
1 // test 1 prim 2 //< @ Gxjun coder> 3 #include<stdio.h> 4 #include<string.h> 5 const int inf=0x3f3f3f3f ; 6 int vis[27],lowc[27]; 7 int prim( const int cost[][27], int n) 8 { 9 int i,j,p; 10 memset(vis,0,sizeof(vis)); 11 vis[0]=1; 12 int minc,res=0; 13 for(i=1; i<n ;i++) 14 lowc[i]=cost[0][i]; 15 for(i=1;i<n;i++) 16 { 17 minc=inf; 18 p=-1; 19 for( j=0; j<n; j++) 20 { 21 if(0==vis[j] && minc>lowc[j]) 22 { 23 minc = lowc[j]; 24 p=j; 25 } 26 } 27 if(minc==inf) return -1; 28 res+=minc; 29 vis[p]=1; 30 for(j=0 ; j<n ;j++) 31 { 32 if(vis[j]==0 && lowc[j]>cost[p][j]) 33 lowc[j]=cost[p][j]; 34 } 35 36 37 } 38 return res; 39 } 40 int sta[27][27]; 41 int main() 42 { 43 int n,m,i,j; 44 char a[2],b[2]; 45 int val; 46 while(scanf("%d",&n),n) 47 { 48 for(i=0 ;i<26; i++) 49 { 50 for( j=0; j<26 ;j++) 51 { 52 sta[i][j]=inf; 53 } 54 } 55 for(i=1; i<n; i++) 56 { 57 58 scanf("%s %d",a,&m); 59 int fo=a[0]-‘A‘; 60 while(m--) 61 { 62 scanf("%s %d",b, &val); 63 int tot=b[0]-‘A‘; 64 sta[fo][tot]=sta[tot][fo]=val; 65 } 66 } 67 68 printf("%d\n",prim(sta,n)); 69 } 70 return 0; 71 }
HDUOJ----1301 Jungle Roads,布布扣,bubuko.com
原文:http://www.cnblogs.com/gongxijun/p/3569219.html