1、Prim
将图分为两部分,一部分是已经被选取为树中的点,另一部分是图中没有被取得点,每次取两边最短的交叉边。代码和迪杰斯特拉很想不过思路完全不同。
模版:
memset(dis,10,sizeof(dis));
memset(f,false,sizeof(f)); f[1]=true; dis[1]=0; for(int i=2;i<=n;i++) {
dis[i]=a[1][i]; } for(int i=1;i<n;i++) { int minn=dis[0]; int k=0; for(int j=1;j<=n;j++) { if(!f[j]&&dis[j]<minn) { minn=dis[j]; k=j; } } ans+=dis[k]; f[k]=true; for(int j=1;j<=n;j++) { if(!f[j]&&dis[j]>a[k][j])dis[j]=a[k][j]
}
}
2、克鲁斯卡尔
用边表存储图,按权值从大到小排序,每次取最小边,如果不构成环,就加入最小边。难点在与判断是否存在环,若使用遍历的方式效率太低,所以用并查集。