HDU 1102 Constructing Roads HDU1863 畅通工程
这两个题都是畅通工程的。杭电上真是各种畅通工程。
1102 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1102
还是用的Prim算法。
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #define N 1000000 4 int map[110][110],lowcost[110]; 5 int visit[110]; 6 int prim(int maxminum) 7 { 8 int sum=0,min,k,i,j; 9 memset(visit,0,sizeof(visit)); 10 visit[1]=true; 11 for(i=1;i<=maxminum;i++) 12 lowcost[i]=map[1][i]; 13 for(i=1;i<=maxminum;i++) 14 { 15 min=N; 16 for(j=1;j<=maxminum;j++) 17 { 18 if(visit[j]==0&&min>lowcost[j]) 19 { 20 min=lowcost[j]; 21 k=j; 22 } 23 } 24 visit[k]=1; 25 if(min==N) 26 break; 27 sum+=min; 28 for(j=1;j<=maxminum;j++) 29 { 30 if(visit[j]==0&&lowcost[j]>map[k][j]) 31 lowcost[j]=map[k][j]; 32 } 33 } 34 return sum; 35 } 36 int main() 37 { 38 int a,b,value,i,maxminum,maxmax,j,sum; 39 while(~scanf("%d",&maxminum)) 40 { 41 memset(map,N,sizeof(map)); 42 for(i=1;i<=maxminum;i++) 43 for(j=1;j<=maxminum;j++) 44 { 45 scanf("%d",&value); 46 if(value<map[i][j]) 47 map[i][j]=map[j][i]=value; 48 49 } 50 scanf("%d",&maxmax); 51 while(maxmax--) 52 { 53 scanf("%d%d",&a,&b); 54 map[a][b]=map[b][a]=0; 55 } 56 sum=prim(maxminum); 57 printf("%d\n",sum); 58 } 59 return 0; 60 }
1863 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1863
继续Prim
View Code
1 #include<stdio.h> 2 #include<string.h> 3 int map[110][110],lowcost[110],visit[110]; 4 #define N 9999999 5 int maxminum,sum,maxmax; 6 void prim() 7 { 8 int i,j,k,min; 9 for(i=1;i<=maxminum;i++) 10 { 11 lowcost[i]=map[1][i]; 12 visit[i]=0; 13 } 14 sum=0; 15 visit[1]=1; 16 for(i=1;i<maxminum;i++) 17 { 18 min=N; 19 for(j=1;j<=maxminum;j++) 20 { 21 if(visit[j]==0&&lowcost[j]<min) 22 { 23 min=lowcost[j]; 24 k=j; 25 } 26 } 27 if(min==N) 28 { 29 printf("?\n"); 30 return; 31 } 32 sum+=min; 33 visit[k]=1; 34 for(j=1;j<=maxminum;j++) 35 { 36 if(visit[j]==0&&map[k][j]<lowcost[j]) 37 { 38 lowcost[j]=map[k][j]; 39 } 40 } 41 } 42 printf("%d\n",sum); 43 } 44 int main() 45 { 46 int i,j,a,b,value; 47 while(~scanf("%d%d",&maxmax,&maxminum)) 48 { 49 if(maxmax==0) 50 break; 51 memset(map,N,sizeof(map)); 52 for (i=0; i<=maxminum; i++) 53 map[i][i]=0; 54 for(i=0;i<maxmax;i++) 55 { 56 scanf("%d%d%d",&a,&b,&value); 57 if(value<map[a][b]) 58 { 59 map[a][b]=map[b][a]=value; 60 } 61 } 62 prim(); 63 } 64 return 0; 65 }
实话来说 Prim肯定不如Kruskal好用,感觉K跟并查集很像。