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 }