生成树模板

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 }
原文地址:https://www.cnblogs.com/InWILL/p/6024426.html