您的位置:首页 > 其它

HDOJ  1301  Jungle Roads

2015-12-18 18:12 387 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1301

很好写的prim吧,同样Kruskal也可以

#include <stdio.h>

#include <math.h>

#include <string.h>

#define MAX 1000000

int Edge[27][27];

int lowcost[27];

int n;

void init()

{

int
i,k,num,x,y;

char
w,e;


for(i=0;i<n;i++)


for(k=0;k<n;k++)


Edge[i][k]=MAX;


for(i=0;i<n-1;i++)

{


scanf("%c %d",&w,&num);


getchar();


for(k=0;k<num;k++)


{


scanf("%c",&e);


x=w-'A';


y=e-'A';


scanf("%d",&Edge[x][y]);


Edge[y][x]=Edge[x][y];


getchar();


}

}


memset(lowcost,0,sizeof(lowcost));

}

void prim()

{

int
i,k;

int
sum=0;


lowcost[0]=-1;


for(i=1;i<n;i++)


lowcost[i]=Edge[0][i];


for(i=1;i<n;i++)

{


int min=MAX,j;


for(k=0;k<n;k++)


{


if(lowcost[k]!=-1&&lowcost[k]<min)


j=k,min=lowcost[k];


}


sum+=min;


lowcost[j]=-1;


for(k=0;k<n;k++)


if(Edge[j][k]<lowcost[k])


lowcost[k]=Edge[j][k];

}


printf("%d\n",sum);

}

int main()

{


while(scanf("%d",&n),getchar(),n)


init(),prim();

return
0;

}

***************************************

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include <string.h>

#define MAX 1000000

#define MAM 27

struct edge

{

int
u,v,w;

}edges[MAX];

int x[MAM],y[MAM];

int parent[MAX];

int n,m;

int i,j;

int sumweight;

int Find(int x)

{

int s;


for(s=x;parent[s]>=0;s=parent[s]);


while(s!=x)

{


int tmp=parent[x];


parent[x]=s;


x=tmp;

}

return
s;

}

void Union(int R1,int R2)

{

int
r1=Find(R1),r2=Find(R2);

int
tmp=parent[r1]+parent[r2];


if(parent[r1]>parent[r2])

{


parent[r1]=r2;


parent[r2]=tmp;

}

else

{


parent[r2]=r1;


parent[r1]=tmp;

}

}

int cmp(const void *a,const void *b)

{

edge
aa=*(const edge *)a;

edge
bb=*(const edge *)b;

return
aa.w-bb.w;

}

void Kruskal()

{

int
num=0;

int
u,v;


memset(parent,-1,sizeof(parent));


for(i=0;i<m;i++)

{


u=edges[i].u;


v=edges[i].v;


if(Find(u)!=Find(v))


{


sumweight+=edges[i].w;


num++;


Union(u,v);


}


if(n-1<=num)


break;

}

}

int main()

{

int
i,k,num,x,y,d;

char
w,e;


while(scanf("%d",&n),getchar(),n)

{


int mi=0;


for(i=0;i<n-1;i++)


{


scanf("%c %d",&w,&num);


getchar();


for(k=0;k<num;k++)


{


scanf("%c",&e);


x=w-'A';


y=e-'A';


scanf("%d",&d);


edges[mi].u=x;


edges[mi].v=y;


edges[mi++].w=d;


getchar();


}


}


m=mi;


qsort(edges,m,sizeof(edges[0]),cmp);


sumweight=0.0;


Kruskal();


printf("%d\n",sumweight);

}

return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: