最小生成树模板
1 #include<bits/stdc++.h> 2 using namespace std; 3 int pre[5005],n,m,ans,cnt; 4 struct lhy 5 { 6 int x,y,cost; 7 }glq[200005]; 8 9 void init() 10 { 11 for(int i=1;i<=5005;i++) pre[i]=i; 12 } 13 int find(int t) 14 { 15 while(t!=pre[t]) t=pre[t]=pre[pre[t]]; 16 return t; 17 } 18 bool cmp(lhy a,lhy b) 19 { 20 return a.cost<b.cost; 21 } 22 void kruskal() 23 { 24 sort(glq+1,glq+m+1,cmp); 25 for(int i=1;i<=m;i++) 26 { 27 int lhy_zz=find(glq[i].x),glq_zz=find(glq[i].y); 28 if(lhy_zz==glq_zz) continue; 29 ans+=glq[i].cost; 30 pre[lhy_zz]=glq_zz; 31 cnt++; 32 if(cnt==n-1) break; 33 } 34 } 35 int main() 36 { 37 init(); 38 scanf("%d%d",&n,&m); 39 for(int i=1;i<=m;i++) 40 { 41 scanf("%d%d%d",&glq[i].x,&glq[i].y,&glq[i].cost); 42 } 43 kruskal(); 44 printf("%d",ans); 45 return 0; 46 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 int cost[105][105],n,c,minn[105]; 4 bool s[105]; 5 int main() 6 { 7 memset(minn,999999,sizeof(minn)); 8 scanf("%d",&n); 9 for(int i=1;i<=n;i++) 10 { 11 for(int j=1;j<=n;j++) 12 { 13 int a; 14 scanf("%d",&a); 15 cost[i][j]=cost[j][i]=a; 16 } 17 } 18 minn[1]=0; 19 for(int i=1;i<=n;i++) 20 { 21 int k=0; 22 for(int j=1;j<=n;j++) 23 { 24 if(s[j]==0&&minn[j]<minn[k]) k=j; 25 } 26 s[k]=1; 27 for(int j=1;j<=n;j++) 28 { 29 if(s[j]==0&&minn[j]>cost[k][j]+minn[k]) minn[j]=cost[k][j]+minn[k]; 30 } 31 } 32 for(int i=1;i<=n;i++) c+=minn[i]; 33 printf("%d",c); 34 return 0; 35 }