最小生成树裸题
prim 算法:
#include<cstdio> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; #define M 510 #define inf 1000000 int dis[M],map[M][M],vis[M]; void prime(int n) { int i,j,sum=0,p,min; memset(vis,0,sizeof(vis)); vis[0]=1; for(i=1;i<n;i++) { dis[i]=map[0][i]; } for(i=1;i<n;i++) { min=inf;p=-1; for(j=1;j<n;j++) if(vis[j]==0&&min>dis[j]) { min=dis[j];p=j; } sum+=min;vis[p]=1; for(j=0;j<n;j++) if(vis[j]==0&&dis[j]>map[p][j]) dis[j]=map[p][j]; } printf("%d\n",sum); } int main() { int t,i,j,n,m,a,b,c; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<n;j++) map[i][j]=inf; for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; } prime(n); } return 0; }
Kruskal 算法:
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <string> using namespace std; int father[1000 + 5]; int n,m; int ans; struct Node { int from,to,value; }node[150000]; void clear() { memset(node,0,sizeof(node)); for(int i=0;i<1005;i++) father[i] = i; ans = 0; } int find(int x) { if(x != father[x]) return find(father[x]); return x; } bool cmp(Node x,Node y) { return x.value < y.value; } void kruskal() { for(int i=0;i<m;i++) { int dx = find(node[i].from); int dy = find(node[i].to); if(dx != dy) { father[dy] = dx; ans += node[i].value; } } } int main() { int t; scanf("%d",&t); while(t--) { clear(); scanf("%d %d",&n,&m); for(int i=0;i<m;i++) { scanf("%d %d %d",&node[i].from,&node[i].to,&node[i].value); if(node[i].value == 0) father[node[i].to] = node[i].from; } sort(node,node+m,cmp); kruskal(); printf("%d\n",ans); } return 0; }