【树】最小生成树

寵の児 提交于 2020-02-15 03:07:31
kruskal算法

↑每一次选出合理的最小边,贪心衍生。

 

 #include <iostream>
 #include<limits.h>//get一个最大宏 
 using namespace std;
     const int max1=101;
     int map[max1][max1],dist[max1],pre[max1];
int prim(int n);
{
    int total=0,min;
    int i,j,k;
    bool flag[max1];//flag[i]=true则i选过(已加入最小树集),=false则未选过 
    for(i=2;i<=n;i++)//从2开始,第一个点特殊定义 
    {
        flag[i]=false;//一开始点全部未选过 
        dist[i]=map[1][i];//把第一层的值先放进dist中 
        pre[i]=1;//pre记录连接情况,现在所有点都还没有连接 
    }
    dist[1]=0; 
    flag[1]=true;//正在处理 
    for(i=1;i<n;i++)//到n-1结束,最后一个点在处理倒数第二个点时连接 
    {
        min=INT_MAX;
        k=0;//清理现场
        for(j=1;j<=n;j++)
        {
            if(!flag[j]&&dist[j]<min)//没有被选中的,离当前点最近的点 
            {
                min=dist[j];
                k=j; 
            }
        } 
        if(k==0)return -1;//没有点可以扩展了 
        flag[k]=true;
        total=total+min;
        for(j=1;j<=n;j++)//更新下一个要搜索的点到当前选择的点的距离 
        {
            if(!flag[j]&&map[k][j]!=INT_MAX&&map[k][j]<dist[j])
            {
                dist[j]=map[k][j];
                pre[j]=k;
            }
        }
    }
    return total;
}
 
 int main(int argc, char *argv[])
 {
     int n;
     int i,j,ans;
     cin>>n;
     for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
     cin>>map[i][j];//储存图像信息
    ans=prim(n);
    cout<<ans; 
     return 0;
 }
prim

↑从一个点通过最小的边走到下一个点。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!