最小生成树 prim
2017-04-15 11:24
351 查看
127: 农场网络 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 36 Solved: 18 [Submit][Status][Web Board] Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000。 Input 第一行: 农场的个数,N(3<=N<=100)。 第二行..结尾: 接下来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们每行限制在80个字符以内,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为线路从第i个农场到它本身的距离在本题中没有意义。 Output 只有一个输出,是连接到每个农场的光纤的最小长度和。 Sample Input 4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0 Sample Output #include<iostream> using namespace std; int n; int map[105][105]; int v[105];//访问标记 int d[105];//记录连接T集合与V-T集合中最小距离 static const int INFTY=(1<<21); int p[105]; int prim() { for(int i=0;i<n;i++) { d[i]=INFTY; v[i]=0; p[i]=-1; } d[0]=0; while(1) { int minv=INFTY; int u; for(int i=0;i<n;i++) { if(v[i]==0&&d[i]<minv) { minv=d[i]; u=i; } } if(minv==INFTY) break; v[u]=1; for(int i=0;i<n;i++) { if(v[i]==0&&map[u][i]) {//与结点u相连的结点i if(map[u][i]<d[i]) { d[i]=map[u][i]; p[i]=u; } } } } int sum=0; for(int i=0;i<n;i++) { if(p[i]!=-1) sum+=map[i][p[i]]; } return sum; } int main() { cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cin>>map[i][j]; } cout<<prim()<<endl; return 0; }
相关文章推荐
- 【数据结构】最小生成树_Prim
- Prim 最小生成树总结
- 最小生成树prim模板
- C++实现矩阵图的遍历·最小生成树(prim,kruskal)·最短路径(Dijkstra,floyd)
- HDU 2489 Minimal Ratio Tree(dfs+最小生成树-Prim)
- poj 2031 最小生成树(prim)
- poj 1258 Agri-Net-----最小生成树 prim
- HDOJ 1233 还是畅通工程 最小生成树 kruskal && prim
- poj1258prim最小生成树
- POJ 1258 Agri-Net 最小生成树 prim && kruskal
- 51nod 1212 无向图最小生成树(prim,kruskal模板)
- 最小生成树的普里姆(Prim)算法
- POJ1679The Unique MST (最小生成树之Prim )(有点坑人)
- 生成树最小生成树poj 1258 prim
- 最小生成树 : Prim 算法
- POJ 1258-Agri-Net(最小生成树prim)
- HDU1875 畅通工程再续 【最小生成树Prim】
- POJ-1258 Agri-Net(最小生成树[Prim])
- 湖南修路(最小生成树prim)
- hdu 1102 最小生成树prim模板题