最小生成树 prim hdu1233 还是畅通工程
2014-08-16 16:38
211 查看
c++代码实现
#include<iostream> using namespace std; const int maxnum=105; const int maxint=99999; int map[maxnum][maxnum]; int lowcost[maxnum];//记录的是以节点i为终点的最小边权值 bool vis[maxnum];//标记已识别的点,相当于起点 int dist;//记录最终的权值总和 void Prim(int N,int map[maxnum][maxnum]) { //初始化 for(int i=1;i<=N;i++) { lowcost[i]=map[1][i];//以1为最初起点,i为终点的权值 vis[i]=0; } vis[1]=1;//第一个点已被标记 dist=0;//最初权值为0; int u=1; /* n个节点至少需要N-1条边构成最小生成树 */ for(int i=1;i<N;i++) { int temp=maxint; //找到以u为终点的最小权值的边 for(int j=1;j<=N;j++) { if(!vis[j]&&lowcost[j]<temp) { u=j; temp=lowcost[j]; } } //累计权值 dist=dist+temp; //标记节点u到生成树 vis[u]=1; //更新当前节点到其他节点的权值 for(int k=1;k<=N;k++) { //发现更小权值 if(!vis[k]&&map[u][k]<lowcost[k]) lowcost[k]=map[u][k]; } } cout<<dist<<endl; } int main () { int N;//输入节点 while(cin>>N) { if(N==0) break; int A,B,D;//两个节点,及之间的距离 //初始化节点之间的距离,假设都不相连,无穷大(取无穷大为maxint) for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) map[i][j]=maxint; //输入各个节点之间的距离 for(int i=1;i<=N*(N-1)/2;i++) { cin>>A>>B>>D; if(D<maxint) { map[A][B]=D; map[B][A]=D;//无向图 } } Prim(N,map); } return 0; }
相关文章推荐
- hdu1233还是畅通工程 最小生成树(prim或kruskal)
- HDU1233 还是畅通工程 【最小生成树Prim】
- 最小生成树(hdu1233还是畅通工程)
- 还是畅通工程 HDU1233(最小生成树)
- hdoj 1233 还是畅通工程【最小生成树 kruskal && prim】
- hdu 1233 还是畅通工程(prim和kruskal最小生成树)
- Hud 1233 还是畅通工程[最小生成树Prim]
- HDU--1233:还是畅通工程 (并查集 & 最小生成树Prim)
- hdu1233还是畅通工程【最小生成树】
- hdu 1233 还是畅通工程 (最小生成树,prim,优先队列,kruskal并查集)
- HDU 1233 还是畅通工程 (最小生成树Prim)
- hdu 1233 还是畅通工程(Prim最小生成树)
- HDOJ 1233 还是畅通工程 【最小生成树】+【prim】
- hdu1233 - 还是畅通工程 (求最小生成树)(Kruskal)
- 最小生成树-hdu1233-还是畅通工程
- hdu1233 还是畅通工程 (kruskal求最小生成树)
- HDU1233--还是畅通工程--最小生成树--并查集
- hdu1233还是畅通工程_最小生成树
- ACM-最小生成树之还是畅通工程——hdu1233
- HDU 1233 还是畅通工程(Prim求最小生成树)