hiho刷题日记——第二十六天最小生成树一·Prim算法

来源:互联网 发布:编程 几率怎么写 编辑:程序博客网 时间:2024/05/08 05:38

题目

用Prim算法做最小生成树

思路

从1开始。将1加入已连接的点。
找到(可以连接到已连接的点)的权值最小的边。
将其的另一端点加入已连接的点。重复到结束。

我这里用了一个d[i]来存储到 i 最小的权值。

代码

#include<cstdio>#include<cstring>using namespace std;const int MAXN=1000+1;int N,g[MAXN][MAXN],vis[MAXN],d[MAXN],k;int prim(){    int ans=0;    memset(vis,0,sizeof(vis));    d[0]=100000;    for(int i=1;i<=N;i++) d[i]=g[1][i];    vis[1]=1;    for(int i=1;i<N;i++)    {        k=0;        for(int j=2;j<=N;j++) if(!vis[j] && d[j]<d[k]) k=j;        vis[k]=1; ans+=d[k];        for(int j=2;j<=N;j++) if(!vis[j] && g[k][j]<d[j]) d[j]=g[k][j];    }    return ans;}int main(){    scanf("%d",&N);    for(int i=1;i<=N;i++)    for(int j=1;j<=N;j++)    scanf("%d",&g[i][j]);    printf("%d",prim());    return 0;}
0 0
原创粉丝点击