您的位置:首页 > 其它

HDOJ 1863 畅通工程

2012-12-15 23:24 302 查看
戳此看题~

最小生成树即可

但是要注意的是给出道路网络可能是两个或多个孤立的网络,这样即使用上所有的边都用上也不能使每两个村庄都相通,最下生成树的边的条数也会比节点数-1还小。(就因为没注意到这一点WA了好几次。。。。



AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXM 100
#define MAX 1000000
int edge[MAXM][MAXM],lowcost[MAXM],m,edgenum,sum;
int prim()
{
int i,j,k,min;
lowcost[0]=-1;
for(i=1;i<m;i++)
lowcost[i]=edge[0][i];
sum=0;
edgenum=0;
for(i=1;i<m;i++)
{
k=-1;
min=MAX;
for(j=0;j<m;j++)
{
if(lowcost[j]!=-1&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
if(k!=-1)
{
sum+=min;
lowcost[k]=-1;
edgenum++;
for(j=0;j<m;j++)
{
if(edge[k][j]<lowcost[j])
lowcost[j]=edge[k][j];
}
}
}
return sum;
}
int main()
{
int i,j,u,v,w,n;
while(scanf("%d %d",&n,&m)!=EOF&&n)
{
if(n>=m-1)
{
for(i=0;i<m;i++)
for(j=0;j<m;j++)
edge[i][j]=MAX;
for(i=0;i<n;i++)
{
scanf("%d %d %d",&u,&v,&w);
edge[u-1][v-1]=edge[v-1][u-1]=w;
}
prim();
if(edgenum>=m-1)
printf("%d\n",sum);
else printf("?\n");
}
else
{
for(i=0;i<n;i++)
scanf("%d %d %d",&u,&v,&w);
printf("?\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: