贪心算法

贪心算法之prim

在某地分布着N个村庄,现在需要在N个村庄之间修路,每个村庄之前的距离不同,问怎么修最短的路,将各个村庄连接起来

解决上述问题称为prim算法, 他是一种产生最小生成树的算法, prim在定点选择利用了贪婪算法

在这里插入图片描述

//如图解决上述问题, 要求最短
#include <iostream>
#include <vector>
//不可达距离
const int INF = 1000000;
//地图表
const int N = 6; //六个点之间
//输出点标识方便查看
char add[N] = {'A','B','C','D','E','F'};

int map[N][N] = {
                {INF,  7,  4,INF,INF,INF},
                {  7,INF,  6,  2,INF,  4},
                {  4,  6,INF,INF,  9,  8},
                {INF,  2,INF,INF,INF,  7},
                {INF,INF,  9,INF,INF,  1},
                {INF,  4,  8,  7,  1,INF}
        };


int prim(int target)
{
        int sum_distance = 0;//总和
        int index = 0;
        int dest[N] = {0}; //到每个点的最短距离
        int visit[N] = {0};//记录那些点已经被访问              
        int i = 0, j = 0; //循环变量
        int min_dist; //最小距离中间变量

        visit[target] = true;//从自己出发所以自己是已经遍历过的
//以target为起点向周边运算
        while(i < N)
        {
                dest[i] = map[target][i];//到各个点的最短距离
                ++i;
        }
        for(i = 1;i < N; ++i)
        {
            	std::cout<<add[index];
                min_dist = INF;
                for(j = 0; j < N;++j)//贪心算法,寻找每次dest中最短的
                {
                        if(!visit[j] && min_dist > dest[j])
                        {
                                min_dist = dest[j];
                                index = j; //记录是到哪一个地方最短以及最短距离
                        }
                }
				std::cout<<"----->"<<add[index]<<std::endl;
                sum_distance += min_dist;
                visit[index] = true;
                std::cout <<min_dist<< std::endl;
                for(j = 0;j < N; ++j)
                {
                        if(!visit[j] && dest[j] > map[index][j])
                        {
                                dest[j] = map[index][j];//更新dest
                        }
                }
        }

        return sum_distance;
}

int main()
{

        std::cout <<"Shortest distance: "<<prim(0)<<std::endl;

        return 0;
}
                            
贪心算法之Kruskal算法

Kruskal算法

#include <iostream>
#include <algorithm>

#define maxRoad 1000
using namespace std;

const int N = 6; //六个点之间
const int Wght = 9;//连接路个数
char add[N] = {'A','B','C','D','E','F'};

struct Road
{
        int Start;
        int End;
        int Weight;
};

struct Road road[Wght] = {
{1,3,4},
{2,1,7},{2,4,2},{2,6,4},
{3,2,6},{3,5,9},{3,6,8},
{4,6,7},
{5,6,1}
};


bool comp(const Road& c1,const Road& c2)
{
        return c1.Weight < c2.Weight;
}

int find(int* Root, int val)
{
        int temp = val;
        while(Root[temp] != temp)
        {
                temp = Root[temp];
        }

        if(Root[val] != val && Root[val] != temp)
        {
                Root[val] = temp;
        }

        return Root[temp];
}

void unionRoot(int *Root,int x,int y)
{
        int temp;
        if(find(Root,x) != find(Root,y))
        {
                temp = find(Root,y);
                Root[temp] = x;;
        }

}

int main()
{
        sort(road,road+Wght,comp);


        int Root[maxRoad] = {0};
        int i, j;  //循环变量
        int sum = 0;


        for(i = 0; i <= N; ++i)
         {
                Root[i] = i;
        //      std::cout<<"  "<< road[i].Weight<<endl;
        }

        for(i = 0; i < Wght; ++i)
        {
                if(find(Root,road[i].Start) != find(Root,road[i].End))
                {
                        unionRoot(Root,road[i].Start,road[i].End);
                        sum += road[i].Weight;
                        std::cout<<"start  end  "<< road[i].Start<<"  "<<road[i].End<<endl;
                }

        }


        cout<<"Shortest path is :"<< sum <<endl;

        return 0;
}
~
~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值