图和树(上)最小生成树-kruskal

这篇博客介绍了如何运用Kruskal算法解决最小生成树问题,通过建立超级源点并构建图,实现寻找灌溉系统最经济方案。算法核心是按边权重排序并尝试合并不产生环的边,直至连接所有节点。

最小生成树 – kruskal

每次贪心的尝试将图中最小的非树边,标记为树边,非法则跳过

将全部边按照权值由小到大排序
按照顺序(边权由小到大)考虑每一条边,只要这条边和我们选择的边不构成环,就保留这条边,否则就放弃这条边
成功选择(n-1)条边后,形成一颗最小生成树秒如果无法选择出(n-1)条边,则说明原图不连通。

const int N = 50005;
const int M = 100005;
struct edge{
int u,v ,w;
bool operator < (const edge &t){return w < t.w;}
}e[M];
int n,m,rt;
int f[N];
void init(int n)
{ 
 for(int i = 1;i <=n;i++)
  f[i] = i;
}
int find(int x)
{
   retunr f[x] == x ? f[x] = find(f[x]);
}
bool unite(int x,int y)
{
  x = find(x);
  y = find(y);
  if(x==y) return false;
  f[x] = y;
  return true;
}
int kruskal_return_max()
{
  std::sort(e+1,e+1+m);
  int cnt = 0,ans=0;
  for(int i = 1;i <= m;++i)
  {
   if(unite(e[i].u,e[i].v))
    { ans = max(ans,e[i].w);
    if(++cnt == n-1) break;
    }   
  }
  return cnt == n-1 ? ans: -1;
}

问题描述
输入样例:
5 5 2
1 2 1
2 3 3
3 4 5
1 3 2
1 4 1
输出结果
8
分析,因为每一块田都可以修建一个抽水机,且至少存在一个抽水机才有可能有水,我们设一个超级源点0,0点到所有点的距离都是p。ab之间有水渠,则建一条无向边,编边权为c。

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100005;

struct Edge{
    int u,v;
    long long w;
    bool operator<(const Edge &t) const
    {
        return w < t.w;
    }
}e[2*MAXN];

int tot,m,n;
int  head[MAXN];
bool vis[MAXN];
long long dis[MAXN];
int f[MAXN];

void init(int n)
{
    for(int i=0;i <= n ;i++)
        f[i] = i;
}

int find(int x)
{
    return f[x] == x ? x : f[x] = find(f[x]);
}

bool unite(int x,int y)
{
    x = find(x);
    y = find(y);
    if(x==y)
    return false;
    f[x] = y;
    return true;
}

long long kruskal()
{
    sort(e+1,e+1+n+m);
    int cnt = 0;
    long long ans = 0;
    for(int i=1;i <= n+m;i++ )
    {
        if(unite(e[i].u, e[i].v))
        {
            ans+=e[i].w;
            if(++cnt == n) break;
        }
    }
    return cnt == n ? ans : -1;
}


int main()
{
    //freopen("6_a.in","r",stdin);
    //freopen("6_a.out","w",stdout);
    long long p;
    cin>>n>>m>>p;
    //设0号点位超级源点
    //将零号点与所有点之间加以一条权值位p的边
    int i=0;
    init(n);
    for( i =1;i <=n;i++)
    {
        e[i].u = 0;
        e[i].v = i;
        e[i].w = p;
    }
    for(;i<=n+m;i++)
    {
        int a, b;
        long long c;
        cin>>a>>b>>c;
        e[i].u = a;
        e[i].v = b;
        e[i].w = c;
    }
    cout<<kruskal()<<endl;
    return 0;
}
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)内容概要:本文档围绕基于遗传算法的异构分布式系统任务调度算法展开研究,重点介绍了一种结合遗传算法的新颖优化方法,并通过Matlab代码实现验证其在复杂调度问题中的有效性。文中还涵盖了多种智能优化算法在生产调度、经济调度、车间调度、无人机路径规划、微电网优化等领域的应用案例,展示了从理论建模到仿真实现的完整流程。此外,文档系统梳理了智能优化、机器学习、路径规划、电力系统管理等多个科研方向的技术体系与实际应用场景,强调“借力”工具与创新思维在科研中的重要性。; 适合人群:具备一定Matlab编程基础,从事智能优化、自动化、电力系统、控制工程等相关领域研究的研究生及科研人员,尤其适合正在开展调度优化、路径规划或算法改进类课题的研究者; 使用场景及目标:①学习遗传算法及其他智能优化算法(如粒子群、蜣螂优化、NSGA等)在任务调度中的设计与实现;②掌握Matlab/Simulink在科研仿真中的综合应用;③获取多领域(如微电网、无人机、车间调度)的算法复现与创新思路; 阅读建议:建议按目录顺序系统浏览,重点关注算法原理与代码实现的对应关系,结合提供的网盘资源下载完整代码进行调试与复现,同时注重从已有案例中提炼可迁移的科研方法与创新路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值