ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

poj1258(最小生成树)



最小生成树。Prim或者Kruskal。

以下Prim算法,输入矩阵:

#include<stdio.h>
    
int  d[103][103],flag[103],lowcost[103],link[103],a[103],b[103];
int main()
{
    
int n,i,j,min,minj,tot;
    
while (scanf("%d",&n)==1)
    {
        
for (i=1;i<=n;i++)
            
for (j=1;j<=n;j++)
                scanf(
"%d",&d[i][j]);
    
        
for (i=1;i<=n;i++)
        {
            flag[i]
=1;
            lowcost[i]
=1000000;
            link[i]
=1;
        }
        
for (i=1;i<=n;i++)
            
if (d[1][i])
                lowcost[i]
=d[1][i];
        flag[
1]=0;tot=0;
        
for (i=2;i<=n;i++)
            {
                min
=1000000;
                
for (j=2;j<=n;j++)
                    
if (flag[j]&&min>lowcost[j])
                    {
                        min
=lowcost[j];
                        minj
=j;
                    }
                flag[minj]
=0;tot+=min;
                
for (j=2;j<=n;j++)
                    
if (flag[j]&&d[minj][j]&&lowcost[j]>d[minj][j])
                    {
                        lowcost[j]
=d[minj][j];
                        link[j]
=minj;
                    }
            }
    
        printf(
"%d\n",tot);
    }
}


哦哦,a[],b[]用来记录生成树的边的。这里没有用上。啊,n^2,这个复杂度不行啊,得学学高级的方法才行啊。

posted on 2012-03-04 00:49 wangs 阅读(220) 评论(0)  编辑 收藏 引用 所属分类: ACM-201203


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理