本文共 1951 字,大约阅读时间需要 6 分钟。
畅通工程 | 继续畅通工程 |
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。 测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。 | 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。 当N为0时输入结束。 |
输入 3 31 2 11 3 22 3 41 32 3 20 100 输出 3? | 输入 31 2 1 01 3 2 02 3 4 031 2 1 01 3 2 02 3 4 131 2 1 01 3 2 12 3 4 10 输出 310 |
这两道题本质上是一样的,所以放在一起对比来看。
畅通工程:
#include//最小生成树,kruskal算法#include typedef struct node{ int a,b,cos;}node; node r[100]; int tree[101];//父结点 int FindRoot(int a){ if(tree[a]==-1) return a; else{ tree[a]=FindRoot(tree[a]); return tree[a]; }} int cmp(const void*a,const void*b){ struct node*aa=a; struct node*bb=b; return aa->cos-bb->cos;} int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF&&n!=0){ int i,a,b,ans=0,e=0; for(i=1;i<=m;i++) tree[i]=-1; for(i=0;i
继续畅通工程:
#include#include #define MAX 101int graph[MAX]; typedef struct{ int val,x,y;}ROAD;ROAD road[MAX*50];int findRoot(int x){ if(graph[x]!=x) return findRoot(graph[x]); else return x;}int cmp(ROAD *r1,ROAD *r2){ return r1->val-r2->val;}int main(){ int N; while(scanf("%d",&N)!=EOF){ int i,x,y,val,flag,rnum,vnum; rnum=0; if(N==0) break; for(i=0;i 1;++i){ x=findRoot(road[i].x); y=findRoot(road[i].y); if(x!=y){ sum+=road[i].val; graph[y]=x; vnum--; } } printf("%d\n",sum); }//fclose(stdin); return 0;}
转载地址:http://cpssi.baihongyu.com/