最小生成树 Kruskal和Prim算法
2010-05-05 17:49
645 查看
农场铺网络问题
Sample Input
Sample Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28 Kruskal算法解答: #include <iostream> #include <algorithm> using namespace std; typedef struct Edge{ int x, y, dis; }; Edge town[10002]; //存放边的两端和长度信息 bool flag[102]; //标记新的结点是否加入 int nodeSet[102]; //标记编号对应的结点所属的集合 bool compare(Edge a, Edge b) { return (a.dis < b.dis); } int main() { int n, nodeTag; while(cin>>n){ nodeTag = 1; for(int i = 1; i <= n; i++){ nodeSet[i] = i; //结点所在的set即为其编号 for(int j = 1; j <= n; j++){ scanf("%d", &town[nodeTag].dis); town[nodeTag].x = i; town[nodeTag].y = j; nodeTag++; } } sort(town+1, town+nodeTag, compare); nodeTag = n+1; //去掉前面的n个0,从最小的边开始 int sum = 0, edgeSet = 0; while(edgeSet < n-1){//n-1条边时完全所有结点的连接,访问过的结点都会加入到一个set中 if((!flag[town[nodeTag].x]) && (flag[town[nodeTag].y])){ sum += town[nodeTag].dis; edgeSet++; flag[town[nodeTag].x] = true; nodeSet[town[nodeTag].x] = nodeSet[town[nodeTag].y]; }else if((flag[town[nodeTag].x]) && (!flag[town[nodeTag].y])){ sum += town[nodeTag].dis; edgeSet++; flag[town[nodeTag].y] = true; nodeSet[town[nodeTag].y] = nodeSet[town[nodeTag].x]; }else if((!flag[town[nodeTag].x]) && (!flag[town[nodeTag].y])){ sum += town[nodeTag].dis; edgeSet++; flag[town[nodeTag].x] = true; flag[town[nodeTag].y] = true; nodeSet[town[nodeTag].x] = nodeSet[town[nodeTag].y]; }else { //两端顶点都加入了set,判断新加入的边是否使结点形成了环 if(nodeSet[town[nodeTag].x] != nodeSet[town[nodeTag].y]){ sum += town[nodeTag].dis; edgeSet++; int tmp = nodeSet[town[nodeTag].y]; for(int i = 1; i <= n; i++) //将两个set中的元素合到一个set中 if(nodeSet[i] == tmp) nodeSet[i] = nodeSet[town[nodeTag].x]; } } nodeTag ++; } cout<<sum<<endl; memset(flag, 0, sizeof(flag)); } return 0; }
相关文章推荐
- 最小生成树 prim算法和kruskal
- 1.1.2最小生成树(Kruskal和Prim算法)
- 【算法】最小生成树(Kruskal和Prim算法)
- 最小生成树-prim算法和kruskal
- 最小生成树之Kruskal和Prim算法——C++实现
- 最小生成树算法 :Prim算法 和 Kruskal 算法
- 最小生成树-还是畅通工程 (Kruskal和Prim算法)
- 最小生成树(Kruskal和Prim算法)
- 最小生成树(Kruskal和Prim算法)详细解释
- python最小生成树kruskal与prim算法
- Kruskal和Prim算法求最小生成树
- 最小生成树(Kruskal和Prim算法)
- 转 最小生成树(kruskal 算法 和prim算法)
- 最小生成树kruskal与prim算法模板
- 算法导论--最小生成树(Kruskal和Prim算法)
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- 第七章-图(5)图的最小生成树(Kruskal和Prim算法)
- HDU 1233-还是畅通工程(经典的最小生成树, Kruskal和prim算法)
- 最小生成树 Kruskal 算法 和 Prim算法