hdu 1102 最小生成树 prim算法+Kruskal算法(并查集)
2011-05-03 17:42
337 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102
题目大意:给定n个村庄,及各村庄间修路的费用,求要使各村庄连通的最小费用,要注意的是,有些村庄间已经有路,就不需要再修了,处理时,只要把已有路的村庄间距离修改为0就可以了
prim算法:
Kruskal算法:
题目大意:给定n个村庄,及各村庄间修路的费用,求要使各村庄连通的最小费用,要注意的是,有些村庄间已经有路,就不需要再修了,处理时,只要把已有路的村庄间距离修改为0就可以了
prim算法:
#include<stdio.h> #define N 105 #define Initmax 1005 int a ,lowcost ,s ,n; int prim() { int i,j,u,Max,sum=0; for(i=1;i<=n;i++) { lowcost[i]=a[1][i]; s[i]=0; } s[1]=1; for(i=1;i<n;i++) { Max=Initmax; for(j=1;j<=n;j++) { if(!s[j] && lowcost[j]<Max) { Max=lowcost[j]; u=j; } } if(Max==Initmax) break; s[u]=1; sum+=lowcost[u]; for(j=1;j<=n;j++) if(!s[j] && lowcost[j]>a[u][j]) lowcost[j]=a[u][j]; } return sum; } int main() { int i,j,x,y,result,t; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]); scanf("%d",&t); while(t--) { scanf("%d%d",&x,&y); a[x][y]=a[y][x]=0; } result=prim(); printf("%d/n",result); } return 0; }
Kruskal算法:
#include<stdio.h> #include<stdlib.h> #define N 105 int n,k; struct node{ int x,y,cost; }edge[10005]; //刚开始开成N了,runtime error一次 int father ; int cmp(const void *a,const void *b) { struct node *c=(struct node *)a; struct node *d=(struct node *)b; return c->cost-d->cost; } int find(int x) { int q,r=x; while(father[r]!=r) r=father[r]; while(x!=r) //带路径压缩 { q=father[x]; father[x]=r; x=q; } return r; } void Union(int a,int b) { int fx,fy; fx=find(a); fy=find(b); if(fx!=fy) father[fx]=fy; } int Kruskal() { int i,a,b,sum=0; qsort(edge,k,sizeof(edge[0]),cmp); for(i=0;i<k;i++) { a=find(edge[i].x); b=find(edge[i].y); if(a!=b) { Union(a,b); sum+=edge[i].cost; } } return sum; } int main() { int i,j,result,t,s,a,b; while(scanf("%d",&n)!=EOF) { k=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { father[j]=j; scanf("%d",&s); if(i>j) { edge[k].x=i; edge[k].y=j; edge[k].cost=s; k++; } } scanf("%d",&t); while(t--) { scanf("%d%d",&a,&b); Union(a,b); } result=Kruskal(); printf("%d/n",result); } return 0; }
相关文章推荐
- 【解题报告】 HDU 1102 Constructing Roads -- 并查集 最小生成树 Prime算法
- hdu 1102 (最小生成树kruskal算法--并查集,prim死活过不了)
- hdu-1102 Constructing Roads(prim最小生成树)
- hdu 1102 Constructing Roads 最小生成树
- hdu 1102 最小生成树prim模板题
- hdu 1102 Constructing Roads(Prim最小生成树)
- hdu1102 hdu1233 hdu4081 hdu4126 最小生成树
- HDU - 1875 畅通工程再续(并查集,最小生成树)
- HDU 1102(最小生成树)
- hdu-1102 Constructing Roads(最小生成树)
- hdu 1863 最小生成树+并查集 (Kruskal)
- 并查集+最小生成树_HDU_1102
- HDU 1102 Constructing Roads(Kruskal最小生成树求最小花费)
- hdu 1879_并查集_最小生成树_Kruskal
- hdu 1102 Constructing Roads(图论:最小生成树)
- hdu 1102 Constructing Roads (最小生成树)
- hdu-1233最小生成树并查集求解
- HDU——1102 Constructing Roads(最小生成树 Prim算法)
- Hdu1102 - Constructing Roads - 最小生成树
- HDU1102 Constructing Roads 最小生成树