【模板】最小生成树

来源:互联网 发布:网络精灵pipopa中文版 编辑:程序博客网 时间:2024/06/03 17:23

kruskal:

#include<cstdio>#include<algorithm>using namespace std;int n,m,MST,num_edge,father[5001],head[5001];bool b[5001];struct Krus{    int from,to,dis;};Krus krus[200001];struct EDGE{    int next,to;}edge[200001];void add_edge(int from,int to){    edge[++num_edge].next=head[from];    edge[num_edge].to=to;    head[from]=num_edge;}int find(int x){    if (father[x]!=x) return father[x]=find(father[x]);    else return father[x];}int unionn(int x,int y){    int xx=find(x);    int yy=find(y);    if (xx!=yy) father[xx]=yy;}bool comp(Krus x,Krus y){    return x.dis<y.dis;}int tot;void dfs(int x){    if (b[x]) return;    b[x]=true;    tot++;    for (int i=head[x]; i!=0; i=edge[i].next)        dfs(edge[i].to);}int main(){    scanf("%d%d",&n,&m);    for (int i=1; i<=n; i++)        father[i]=i;    for (int i=1; i<=m; i++)    {        scanf("%d%d%d",&krus[i].from,&krus[i].to,&krus[i].dis);        add_edge(krus[i].from,krus[i].to);    }    dfs(1);    if (tot<n) {printf("orz"); return 0;}    sort(krus+1,krus+1+m,comp);    int k=0;    for (int i=1; i<=m; i++)        if (find(krus[i].from)!=find(krus[i].to))        {            k++;            MST+=krus[i].dis;            unionn(krus[i].from,krus[i].to);//          if (k==n-1) break;        }    printf("%d",MST);    return 0;}/*4 51 2 21 3 21 4 32 3 43 4 37*/
原创粉丝点击