首页 > 代码库 > prim

prim

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<string> 6 #include<vector> 7 #include<set> 8 #include<map> 9 #include<queue>10 #include<stack>11 using namespace std;12 const int inf=0xffffff;13 const int MAXN=21;14 int edges[MAXN][MAXN];15 int lowcost[MAXN];16 int nearvex[MAXN];17 int n,m;18 void prim(int u0)19 {20     int i,j;21     int sum=0;22     for(i=1;i<=n;i++)23     {24         lowcost[i]=edges[u0][i];25         nearvex[i]=u0;26     }27     nearvex[u0]=-1;28     for(i=1;i<n;i++)            //找出n-1个顶点 29     {30         int min=inf;31         int v=-1;32         for(j=1;j<=n;j++)33         {34             if(nearvex[j]!=-1&&lowcost[j]<min)35             {36                 v=j;37                 min=lowcost[j];38             }39         }40         if(v!=-1)41         {42             printf("%d %d %d\n",nearvex[v],v,lowcost[v]);43             nearvex[v]=-1;44             sum+=lowcost[v];45             for(j=1;j<=n;j++)46             {47                 if(nearvex[j]!=-1&&edges[v][j]<lowcost[j])48                 {49                     lowcost[j]=edges[v][j];50                     nearvex[j]=v;51                 }52             }53         }54     }55 }56 int main()57 {58     int i,j;59     int u,v,w;60     scanf("%d %d",&n,&m);61     memset(edges,0,sizeof(edges));62     for(i=1;i<=m;i++)63     {64         scanf("%d%d%d",&u,&v,&w);65         edges[u][v]=edges[v][u]=w;66     }67     for(i=1;i<=n;i++)68         for(j=1;j<=n;j++)69         {70             if(i==j)71                 edges[i][j]=0;72             else if(edges[i][j]==0)73                 edges[i][j]=inf;74         }75     prim(1);76     return 0;77 } 

 

prim