zoj 2326 Tangled in Cables 最小生成树
来源:互联网 发布:陕西干部网络培训答案 编辑:程序博客网 时间:2024/05/22 12:06
嗯,写最小生成树终于有感觉了,一次就AC了,比前两道好多了,不过,这次我没有用qsort,还是用了一般的排序,看来qsort是得好好学学了,这样,我的代码可以短很多,看着也会舒服了。。。
#include<stdio.h>#include<string.h>typedef struct{ int x,y; double w;}NODE; NODE node[10000];int pre[5000];void change1(int *x,int *y) { int t; t=*x; *x=*y; *y=t; } void change2(double *x,double *y){ double t; t=*x; *x=*y; *y=t; }int find(int x){ while(x!=pre[x]) x=pre[x]; return x;} void kruskal(int k,double total){ int i,j,a,b,h; double sum=0.0; for(i=0;i<k-1;i++) { h=i; for(j=i+1;j<k;j++) if(node[h].w>node[j].w) h=j; if(h!=i) { change1(&node[i].x,&node[h].x); change1(&node[i].y,&node[h].y); change2(&node[i].w,&node[h].w); } } for(i=0;i<k;i++) { a=find(node[i].x); b=find(node[i].y); if(a!=b) { sum+=node[i].w; pre[b]=a; } } if(sum>total) printf("Not enough cable\n"); else printf("Need %.1lf miles of cable",sum); }int main(){ double total; int i,j,house,paths,k; char a[5000][25],b[25],c[25]; scanf("%lf%d",&total,&house); for(i=1;i<=house;i++) pre[i]=i; for(i=1;i<=house;i++) scanf("%s",a[i]); scanf("%d",&paths); for(i=0;i<paths;i++) { k=0; scanf("%s%s%lf",b,c,&node[i].w); for(j=1;j<=house;j++) { if(strcmp(b,a[j])==0) { node[i].x=j; k++; } if(strcmp(c,a[j])==0) { k++; node[i].y=j; } if(k==2) break; } } kruskal(paths,total); return 0; }呵呵,不错不错,我改了一下,把qsort加了进去,没出现让人头疼的Floating Point Error ,这样代码看着就舒服了。。
#include<stdio.h>#include<string.h>typedef struct{ int x,y; double w;}NODE; NODE node[10000];int pre[5000];int cmp(const void *a,const void *b) { return ((NODE*)a)->w > ((NODE*)b)->w ? 1 : -1; } int find(int x){ while(x!=pre[x]) x=pre[x]; return x;} void kruskal(int k,double total){ int i,j,a,b,h; double sum=0.0; qsort(node,k,sizeof(NODE),cmp); for(i=0;i<k;i++) { a=find(node[i].x); b=find(node[i].y); if(a!=b) { sum+=node[i].w; pre[b]=a; } } if(sum>total) printf("Not enough cable\n"); else printf("Need %.1lf miles of cable",sum); }int main(){ double total; int i,j,house,paths,k; char a[5000][25],b[25],c[25]; scanf("%lf%d",&total,&house); for(i=1;i<=house;i++) pre[i]=i; for(i=1;i<=house;i++) scanf("%s",a[i]); scanf("%d",&paths); for(i=0;i<paths;i++) { k=0; scanf("%s%s%lf",b,c,&node[i].w); for(j=1;j<=house;j++) { if(strcmp(b,a[j])==0) { node[i].x=j; k++; } if(strcmp(c,a[j])==0) { k++; node[i].y=j; } if(k==2) break; } } kruskal(paths,total); return 0; }
- zoj 2326 Tangled in Cables 最小生成树
- ZOJ 2326 Tangled in Cables(最小生成树--prime)
- zoj 2326 Tangled in Cables【最小生成树 kruskal && prim】
- zoj 2326 Tangled in Cables
- zoj 2326 Tangled in Cables
- ZOJ 2326 Tangled in Cables
- ZOJ 2326 Tangled in Cables
- POJ 2075 Tangled in Cables(最小生成树)
- poj 2075 -- Tangled in Cables(最小生成树)
- poj2075 Tangled in Cables 最小生成树+map,kruskal
- POJ 2075 Tangled in Cables(最小生成树)
- POJ 2075 Tangled in Cables 最小生成树
- POJ 2075 Tangled in Cables 最小生成树 Kruskal && Prim
- poj 2075 Tangled in Cables【最小生成树+字符串处理】
- POJ 2075 Tangled in Cables(最小生成树 kruscal)
- zoj 2326 Tangled in Cables【kruskal】
- CUGB图论专场:C - Tangled in Cables(最小生成树kruscal)
- zoj 2326 || poj 2075 Tangled in Cables(MST)
- 在timer.elapsed里边调用button.click事件
- POJ1260 Pearls DP
- 可变参数的函数说明
- RTTI
- (学习记)使有Intent浏览网页!
- zoj 2326 Tangled in Cables 最小生成树
- 尽量用new和delete而不用malloc和free
- 现代数据库管理学习笔记四 增强型E-R模型和业务规则
- Android Brightness Changing
- 童年的回忆
- fread-fwrite pointer
- 自动升级的原理及实现
- oracle 简单存储过程及在PL/Sql中执行
- Linux下c++位域精解