本文共 1509 字,大约阅读时间需要 5 分钟。
题目链接:
题目描述:
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。输入格式:
输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路。输入样例:
6 15 1 2 5 1 3 3 1 4 7 1 5 4 1 6 2 2 3 4 2 4 6 2 5 2 2 6 6 3 4 6 3 5 1 3 6 1 4 5 10 4 6 8 5 6 3输出样例:
12样例示意图:
题目思路:最小生成树的求解。
kruskal算法参考代码:
#include#include int n,m;int sum=0,count=0;int parent[1001];struct node{ int A; int B; int cost;}a[3001];/*并查集之初始化操作*/void init(){ int i; for(i=1;i<=n;i++) parent[i]=i;}/*并查集之查找根节点操作*/int find(int x){ if(x==parent[x]) return x; else return parent[x]=find(parent[x]);}/*qsort()比较函数*/int cmp(const void *a,const void *b){ struct node* pa=(struct node*)a; struct node* pb=(struct node*)b; int num1=pa->cost; int num2=pb->cost; return num1-num2;}/*将边按权值排好序后,如果加入该边不构成回路,则将该边加入图中。*/void kruskal(){ int i; for(i=0;i
prim算法求解:
#include#include #define INF 65535int n,m;int map[1001][1001];int visited[1001];int dist[1001];void init(){ int i,j; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) map[i][j]=INF; }}int prim(int s){ memset(visited,0,sizeof(visited)); int i,j,sum=0; for(i=1;i<=n;i++) dist[i]=map[s][i]; visited[s]=1; for(i=1;i map[pos][j]) dist[j]=map[pos][j]; } } for(i=1;i<=n;i++) { sum+=dist[i]; if(dist[i]==INF) return -1; } return sum;}int main(){ scanf("%d%d",&n,&m); int i,x,y,z; for(i=0;i
转载地址:http://izrq.baihongyu.com/