zoj2048//POJ 1751 最小生成树Prim算法实现
2012-04-19 17:07
706 查看
View Code
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 760 #define Maxint 99999999 double lowcost , c ; double x , y ; int towns, m, s , closest ,path ; double distance(int i,int j)//用double为了防止int数据存不下 { return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); } void Prim() { int i,j,k; double min; for(i=2; i<=towns; i++) { lowcost[i] = c[1][i]; closest[i] = 1; } for(i=1; i<towns; i++) { min = Maxint; j = 1; for(k=2; k<=towns; k++) { if((lowcost[k]<min) && (!s[k])) { min = lowcost[k]; j = k; } } s[j] = 1; lowcost[j] = min;//这个一开始忘了加WA了几次,将lowcost最小值更新为已求出的min for(k=2; k<=towns; k++) { if((c[j][k] < lowcost[k]) && (!s[k])) { lowcost[k] = c[j][k]; closest[k] = j; } } } } int main() { int i, j, a, b, k,ncases; scanf("%d",&ncases); while( ncases-- ) { scanf("%d",&towns); for(i=1; i<=towns; i++) { scanf("%lf%lf",&x[i],&y[i]); } memset(s,0,sizeof(s)); for(i=1; i<=towns; i++) for(j=1; j<=towns; j++) { c[i][j] = distance(i,j);//求出任意两点间的距离 } scanf("%d",&m); for(i=1; i<=m; i++) { scanf("%d%d",&a,&b); c[a][b] = c[b][a] = 0;//设置成0为了下面查找时方便排除 } Prim(); for(i=1; i<=towns; i++) { if( c[i][closest[i]] ) printf("%d %d\n",i,closest[i]); } if(ncases) printf("\n"); } // system("pause"); return 0; }
相关文章推荐
- 最小生成树prim算法实现
- Prim算法的实现及应用( 最小生成树)
- 最小生成树Prim算法 Highways POJ - 1751
- 最小生成树——prim算法实现
- Prim算法最小生成树c++实现
- 最小生成树之Kruskal和Prim算法——C++实现
- C语言——Prim算法实现最小生成树
- Prim算法求解最小生成树的Java实现
- POJ-1751 最小生成树 (prim算法)
- 简单实现最小生成树-Prim算法
- 最小生成树之Prim算法C++实现
- java实现最小生成树的prim算法和kruskal算法
- 最小生成树prim算法实现
- 图论--最小生成树Prim算法Java实现
- prim算法构造最小生成树(邻接表和数组两种存储方式实现)
- 最小生成树-Prim算法 java代码实现
- 图论算法:最小生成树——Prim算法和Kruskal算法C++实现
- 数据结构(C实现)------- 最小生成树之Prim算法
- POJ 1751 Highways(最小生成树 prim算法)
- 最小生成树的Prim算法实现