数据结构实验之图论六:村村通公路
2016-01-14 22:30
351 查看
数据结构实验之图论六:村村通公路
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。输入
连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。输出
输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。示例输入
5 8 1 2 12 1 3 9 1 4 11 1 5 3 2 3 6 2 4 9 3 4 4 4 5 6
示例输出
19
提示
prim算法
<pre class="cpp" name="code">#include<bits/stdc++.h> using namespace std; const int MAX=2147483647; int Prim(int arc[][101],int n) { int lowcost[2*n]; int p,s=0; for (int i=1;i<=n;i++) //将邻接矩阵第一行数据存入数组中 lowcost[i]=arc[1][i]; for (int i=1;i<n;i++) //生成最小生成树 { int minc=MAX; p=-1;//记录下一个结点 for (int j=1;j<=n;j++)//筛选最短权值 { if (lowcost[j]!=0&&lowcost[j]<minc) { minc=lowcost[j]; p=j; } } if (p==-1) return -1; s+=minc; lowcost[p]=0;//记录已被访问的结点 for (int j=1;j<=n;j++) { if (lowcost[j]!=0&&lowcost[j]>arc[p][j])//更新存放邻接矩阵下一行数据 { lowcost[j]=arc[p][j]; } } } return s; } int main() { int n,m; int a,b,c; int arc[101][101]; while (cin>>n>>m) { for (int i=0;i<=n;i++) { for (int j=0;j<=n;j++) { if (i==j) arc[i][j]=0; else arc[i][j]=MAX; } } for (int i=0;i<m;i++) { cin>>a>>b>>c; arc[a][b]=arc[b][a]=c; } cout<<Prim(arc,n)<<endl; } }
Kruscal算法
#include<bits/stdc++.h> using namespace std; int n,m,t,ring[10001]; //存储道路信息 struct node { int a,b,c; }road[4000]; //判断是否存在环路 int Find(int x) { while (x!=ring[x]) x=ring[x]; return x; } //Kruscal算法 void Kruscal() { int fx,fy; for (int i=0;i<m;i++) { fx=Find(road[i].a); fy=Find(road[i].b); if (fx!=fy) { t+=road[i].c; ring[fx]=fy; } } } //快排比较函数 bool cmp(node a,node b) { return a.c<b.c; } int main() { while (cin>>n>>m) { t=0; for (int i=1;i<=n;i++) ring[i]=i; for (int i=0;i<m;i++) { cin>>road[i].a>>road[i].b>>road[i].c; } sort(road,road+m,cmp); Kruscal(); int s=0; //正常情况下,ring数组中只有一个值等于其下标本身,即如果能够连通所有节点应该在同一棵树上 for (int i=1;i<=n;i++) { if (Find(i)==i) s++; } if (s!=1) cout<<"-1"<<endl; else cout<<t<<endl; } return 0; }
相关文章推荐
- 二叉树中序遍历,非递归,用栈
- 数据结构——链表
- 数据结构_6:树:C语言_顺序存储
- 【Java数据结构】线性表
- 浅谈PHP数据结构之单链表
- 数据结构_6:树:C语言_基本概念
- 算法导论14:树形数据结构——二叉树 2016.1.14
- swift排序算法和数据结构
- 数据结构--堆
- 基础数据结构概念回顾
- 二.学习数据结构之数组
- 学数据结构与算法推荐的书
- 数据结构与算法之——五大查找
- 数据结构之(prim)最小生成树
- 数据结构之二叉排序树
- 数据结构一线性表的操作
- 数据结构_5:字符串:C语言
- 二叉树先序建立,先序遍历,中序遍历,后序遍历(递归)
- java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 LinkedList
- 数据结构之常见的数据结构