zoukankan      html  css  js  c++  java
  • 生成树模板

    kruskal:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 struct Edge
     7 {
     8     int u,v,w;
     9 }E[50000];
    10 
    11 int n,m,ans;
    12 int F[10000];
    13 
    14 bool cmp(Edge A,Edge B)
    15 {
    16     return A.w<B.w;
    17 }
    18 
    19 int find(int a)
    20 {
    21     while(F[a]!=0) a=F[a];
    22     return a;
    23 }
    24 
    25 int main()
    26 {
    27     scanf("%d %d",&n,&m);
    28     for(int i=0;i<m;i++)
    29     {
    30         int x,y,z;
    31         scanf("%d %d %d",&x,&y,&z);
    32         E[i].u=x;E[i].v=y;E[i].w=z;
    33     }
    34     sort(E,E+m,cmp);
    35     for(int i=0;i<m;i++)
    36     {
    37         int u=find(E[i].u);
    38         int v=find(E[i].v);
    39         if(u!=v)
    40         {
    41             F[u]=v;
    42             ans+=E[i].w;
    43         }
    44     }
    45     printf("%d
    ",ans);
    46 }

    Prim:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 const int MAXN=1001;
     6 const int INF=0x7f7f7f7f;
     7 int Edge[MAXN][MAXN]={0};
     8 int n,m,ans=0;
     9 
    10 void Prim(int s)
    11 {
    12     int u=s;
    13     int L[MAXN],F[MAXN];
    14     for(int i=1;i<=n;i++)
    15         L[i]=Edge[s][i],F[i]=s;
    16     L[s]=0;
    17     for(int i=1;i<n;i++)
    18     {
    19         int minn=INF;
    20         for(int j=1;j<=n;j++)
    21             if(L[j]<minn&&L[j]!=0)
    22             {
    23                 minn=L[j];
    24                 u=j;
    25             }
    26         ans+=minn;
    27         L[u]=0;
    28         L[F[u]]=0;
    29         for(int j=1;j<=n;j++)
    30             if(Edge[u][j]!=0&&Edge[u][j]<L[j])
    31             {
    32                 L[j]=Edge[u][j];
    33                 F[j]=u;
    34             }
    35     }
    36 }
    37 
    38 int main()
    39 {
    40     cin>>n>>m;
    41     memset(Edge,0x7f,sizeof(Edge));
    42     for(int i=1;i<=m;i++)
    43     {
    44         int x,y,z;
    45         cin>>x>>y>>z;
    46         Edge[x][y]=Edge[y][x]=z;
    47     }
    48     Prim(1);
    49     cout<<ans<<endl;
    50 }
  • 相关阅读:
    汉诺塔问题_栈模拟递归
    汉诺塔问题_栈模拟递归
    Dockerfile指令
    Dockerfile指令
    C++全排列组合算法
    剑指offer——复杂链表复制
    数据库中的索引实现原理
    TCP三次握手四次挥手详解
    TCP协议原理
    OSI七层模型
  • 原文地址:https://www.cnblogs.com/InWILL/p/6024426.html
Copyright © 2011-2022 走看看