输入:一个加权连通图
算法思路:将图分为两个部分,一个是已经进入最小生成树的部分a,一个是还未进入最小生成树的部分b
现在我们在连接a和b的边中找到一条最小的,并把它加入最小生成树中
重复这个过程直到所有点都进入最小生成树
初始化:将第一个点的数据放入最小生成树即可
数学证明:
反证法:假设prim生成的不是最小生成树
1).设prim生成的树为G0
2).假设存在Gmin使得cost(Gmin)<cost(G0) 则在Gmin中存在<u,v>不属于G0
3).将<u,v>加入G0中可得一个环,且<u,v>不是该环的最长边(这是因为<u,v>∈Gmin)
4).这与prim每次生成最短边矛盾
5).故假设不成立,命题得证.
代码模板:long Prime(int n,int Graph[maxn][maxn])
{
int vis[maxn],d[maxn];
memset(vis,0,sizeof(vis));
for (int i=1;i<=n;i++)
d[i]=Graph[1][i];//初始化:从第一个点开始
for (int i=1;i<=n;i++)//一次找一个点所以需要n次这里的i只是为了计数而已
{
int Min=inf,v;
for (int j=1;j<=n;j++)
if (!vis[j]&&d[j]<Min)
{Min=d[j];v=j;}//找出不在集合里的距离最小的点
vis[v]=1;//这个东西就可以保证d[j]不再变化
for (int j=1;j<=n;j++)//保证在d[i]为i到连接到以联通的图中的最短路线博主真是太聪明了
if (!vis[j]&&d[j]>Graph[v][j])
d[j]=Graph[v][j];
}
long cost(0);
for (int i=1;i<=n;i++)
cost+=d[i];
return cost;
}