hdu 1233 还是畅通工程(prim和kruskal)
http://acm.hdu.edu.cn/showproblem.php?pid=1233
还是畅通工程Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 14263 Accepted Submission(s): 6485
当N为0时,输入结束,该用例不被处理。
prim算法:
#include<iostream>
using namespacestd;#define INF 999999 intmap[101][101];
intv[101],dis[101];
intprim(intn)
{
inti;
for(i=2;i<=n;i++)
dis[i]=map[1][i];
memset(v,0,sizeof(v));
v[1]=1;
intsum=0,k=1,min,j;
for(i=2;i<=n;i++)
{
min=INF;
for(j=2;j<=n;j++)
if(!v[j]&&dis[j]<min)
{
k=j;
min=dis[j];
}
if(min!=INF)
sum+=min;
v[k]=1;
for(j=1;j<=n;j++)
if(k!=j&&map[k][j]<dis[j])
dis[j]=map[k][j];
}
returnsum;
}
intmain()
{
intn;
while(~scanf("%d",&n)&&n)
{
intm=n*(n-1)/2;
intx,y,p;
while(m--)
{
scanf("%d%d%d",&x,&y,&p);
map[x][y]=p;
map[y][x]=p;
}
printf("%d\n",prim(n));
}
return0;
}
kruskal算法:
#include<iostream>
#include<algorithm>
using namespacestd;
structnod
{
intx,y,v;
}node[5010];
intparent[101];
intcomp(nod a,nod b){returna.v<b.v;}
intfindp(inta)
{
while(a!=parent[a])
a=parent[a];
returna;
}
intdeal(nod a)
{
intx=findp(a.x);
inty=findp(a.y);
if(x!=y)
{
parent[y]=x;
returna.v;
}
return0;
}
intmain()
{
intn;
while(~scanf("%d",&n)&&n)
{
intm=n*(n-1)/2;
inti,j;
for(i=1;i<=n;i++)
parent[i]=i;
for(i=0;i<m;i++)
scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].v);
sort(node,node+m,comp);
intsum=0;
for(i=0;i<m;i++)
sum+=deal(node[i]);
printf("%d\n",sum);
}
return0;
}