当前位置 : 主页 > 编程语言 > c语言 >

最小生成树模板

来源:互联网 收集:自由互联 发布时间:2023-09-07
#includebits/stdc++.husing namespace std;typedef long long ll;#define inf 0x3f3f3f3f struct Edge{ int u,v,w;}edge[MAXM];int tot;void addedge(int u,int v,int w){ edge[tot].u=u; edge[tot].v=v; edge[tot++].w=w;}// 注意 加边时是有向边!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f

 struct Edge
{
    int u,v,w;
}edge[MAXM];

int tot;
void addedge(int u,int v,int w)
{
    edge[tot].u=u;
    edge[tot].v=v;
    edge[tot++].w=w;
}//   注意 加边时是有向边!!!
//    所以如果是无向图求最小生成树的话,
//    addedge( u,v,w ), addedge( v,u,w ) 两次加边 ( 即反向 )即可 

bool cmp(Edge a,Edge b)
{
    return a.w<b.w;
}

int Find(int x)
{
    if(F[x]==-1)return x;
    else
        return F[x]=Find(F[x]);
}

int kruskal(int n)
{
    memset(F,-1,sizeof(F));
    sort(edge,edge+tot,cmp);
    int cnt=0;
    int ans=0;
    for(int i=0;i<tot;i++){
        int u=edge[i].u;
        int v=edge[i].v;
        int w=edge[i].w;
        int t1=Find(u);
        int t2=Find(v);
        if(t1!=t2){
            ans+=w;
            F[t1]=t2;
            cnt++;
        }
        if(cnt==n-1)break;
    }
    if(cnt<n-1)return -1;//   图不连通  
    else return ans;//   最小生成树权值  

}

上一篇:手撕一棵树之-----二叉树常见OJ面试题
下一篇:没有了
网友评论