数据结构实验之图论六:村村通公路
2015-11-25 09:28
585 查看
数据结构实验之图论六:村村通公路
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
提示
来源
xam示例程序
解法一:(Prime算法)#include<stdio.h> #include<string.h> #define INF 2147483647 int vis[10000],dis[101][101]; int lowc[10000]; int prime(int cost[][101],int n) { int i,j,p; int minc,res=0; memset(vis,0,sizeof(vis)); vis[1]=1; for(i=1;i<=n;i++) { lowc[i]=cost[1][i]; } for(i=1;i<n;i++) { minc=INF; p=-1; for(j=1;j<=n;j++) { if(0==vis[j]&&minc>lowc[j]) { minc=lowc[j]; p=j; } } if(INF==minc) return -1; res+=minc; vis[p]=1; for(j=1;j<=n;j++) { if(vis[j]==0&&lowc[j]>cost[p][j]) { lowc[j]=cost[p][j]; } } } return res; } int main() { int m,n,i,j,x,y,w; while(scanf("%d %d",&n,&m)!=EOF) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(j==i) { dis[i][j]=0; } else { dis[i][j]=INF; } } } for(i=0;i<m;i++) { scanf("%d %d %d",&x,&y,&w); if(dis[x][y]>w) { dis[x][y]=w; dis[y][x]=w; } } printf("%d\n",prime(dis,n)); } }
解法二:(Kruscal算法)
#include<stdio.h> #include<string.h> #include<stdlib.h> int m,n,t; int vset[1010]; struct node { int a,b,c; }s[3010]; int find(int x) { while(x!=vset[x]) x=vset[x]; return x; } void Kruscal() { int i,fx,fy; for(i=0;i<m;i++) { fx=find(s[i].a); fy=find(s[i].b); if(fx!=fy) { t+=s[i].c; vset[fx]=fy; } } } int cmp(const void *a,const void *b) { return (*(struct node *)a).c>(*(struct node *)b).c?1:-1; } int main() { int i,j,k,l; while(scanf("%d %d",&n,&m)!=EOF) { for(i=1;i<=n;i++) vset[i]=i; t=0; for(i=0;i<m;i++) { scanf("%d %d %d",&s[i].a,&s[i].b,&s[i].c); } qsort(s,m,sizeof(s[0]),cmp); Kruscal(); l=0; for(i=1;i<=n;i++) if(find(i)==i) l++; if(l!=1) printf("-1\n"); else printf("%d\n",t); } }
相关文章推荐
- javascript数据结构之二叉搜索树实现方法
- javascript数据结构之双链表插入排序实例详解
- 数据结构实验之链表八:Farey序列
- 数据结构实验之串三:KMP应用
- 数据结构--红黑树(java)
- 【数据结构与算法】排序算法之六:快速排序
- 【数据结构与算法】排序算法之六:快速排序
- 【数据结构与算法】排序算法之五:归并排序
- 【数据结构与算法】排序算法之五:归并排序
- 数据结构?
- 转载:java集合类数据结构分析
- 树-C实现
- 链表堆栈C实现
- 【以太网数据结构】地址解析协议ARP
- 对带头结点的单链表的简单操作
- 数据结构作业 校园导航问题
- 数据结构 — 图 之 MPT(最短路径 — dijkstra算法 )
- 数据结构和算法之图---图的遍历之深度搜索dfs
- 【以太网数据结构】以太网头部
- JavaScript 数据结构(5):单链表 LinkList