1233 最小生成树 prim 从1开始

    技术2025-08-10  16

    #include <stdio.h> #include <string.h> #define N 101 #define INF 0x7ffffff int map[N][N]; bool mark[N]; int path[N];//mark过点集合到未mark过点i的最短距离 int n; int Min (int a,int b) { return a<b? a:b; } int prim() { int i,v,min,j,sum=0; memset(mark,0,sizeof(mark)); mark[1]=1;//先mark一个点 for (i=1;i<=n;i++) path[i]=map[1][i];//初始距离 for (i=2;i<=n;i++)//剩下n-1个点 { v=2; while(mark[v]) v++;//每次先找一个未mark点 min=path[v]; for (j=v+1;j<=n;j++)//找出最小值 { if (!mark[j] && path[j]<min) { min=path[j]; v=j; } } if (min==INF) return -1;//有一个点没有路 sum+=min; mark[v]=1; for (j=1;j<=n;j++)//用新加入的点v修改path { if (!mark[j]) { path[j]=Min(path[j],map[v][j]); } } } return sum; } int main () { //freopen("1233.txt","r",stdin); int i,j,t,u,v,d; while(scanf("%d",&n),n) { t=n*(n-1)/2; for (i=1;i<=n;i++) { for (j=1;j<=n;j++) map[i][j]=INF; } while(t--) { scanf("%d%d%d",&u,&v,&d); map[u][v]=map[v][u]=d; } printf("%d\n",prim()); } }
    最新回复(0)