51Nod 1212 无向图最小生成树
2017-03-04 22:41
344 查看
1212 无向图最小生成树 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。 Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000) 第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000) Output 输出最小生成树的所有边的权值之和。 Input示例 9 14 1 2 4 2 3 8 3 4 7 4 5 9 5 6 10 6 7 2 7 8 1 8 9 7 2 8 11 3 9 2 7 9 6 3 6 4 4 6 14 1 8 8 Output示例 37 //用普里姆算法(贪心策略) #include<iostream> using namespace std; const static int WHITE=0; const static int GRAY=1; const static int BLACK=2; const static int MAX=10000; const static int INFTY=(1<<21); int m,n; int color[MAX],d[MAX],p[MAX],M[MAX][MAX];//p 是父结点数组,d 记录权值最小边的权值 int prim() { for(int i=1;i<=n;i++)//初始化 { color[i]=WHITE; p[i]=-1; d[i]=INFTY; } d[1]=0; while(1) { int minv=INFTY,u=-1; for(int i=1;i<=n;i++) { if(color[i]!=BLACK&&d[i]<minv)//未被访问 { minv=d[i];//选出最小的边 u=i; } } if(u==-1) break; color[u]=BLACK; for(int v=1;v<=n;v++) { if(color[v]!=BLACK&&M[u][v]!=0)//未被访问,且相连 { if(d[v]>M[u][v])//更新 { d[v]=M[u][v]; p[v]=u; color[v]=GRAY; } } } } int sum=0; for(int i=1;i<=n;i++) { sum+=d[i]; } return sum; } int main() { int a,b,l; cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { M[i][j]=0; } } for(int i=1;i<=m;i++) { cin>>a>>b>>l; M[a][b]=M[b][a]=l; } cout<<prim()<<endl; return 0; }
相关文章推荐
- 51Nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51Nod 1212无向图最小生成树
- 51Nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树(Kruskal算法)
- 51nod:1212 无向图最小生成树
- 51nod 1212 无向图最小生成树(prim)
- 20141004 【 图论 -- 最小生成树(Dijkstra) 】 51nod 1212 . 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树(prim算法和kruska算法) 新手小结
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树(prim,kruskal模板)
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树 (Kruskal)
- 51Nod 1212 无向图最小生成树(最小生成树Kruskal & Prim
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 1212 无向图最小生成树