hdoj1879继续畅通工程
2015-08-11 11:21
337 查看
继续畅通工程
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17816 Accepted Submission(s): 7669
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。
当N为0时输入结束。
Output
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
Sample Input
3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
Sample Output
3
1
0
模板题,最小生成树:
prim算法:
#include<stdio.h> #include<string.h> #define inf 100000000 #define ac 1100 int country,road; int map[ac][ac],dist[ac],v[ac]; void prim() { int i,j,k; int next,mindist,outcome=0; memset(v,0,sizeof(v)); for(i=1;i<=country;i++) dist[i]=map[1][i]; v[1]=1; for(i=2;i<=country;i++) { mindist=inf; for(j=1;j<=country;j++)//寻找最小距离 { if(!v[j]&&mindist>dist[j]) { mindist=dist[j]; next=j; } } outcome+=mindist; v[next]=j; for(j=1;j<=country;j++)//更新路径 { if(!v[j]&&dist[j]>map[next][j]) dist[j]=map[next][j]; } } printf("%d\n",outcome); } int main() { int i,j,k; int a,b,c,d; while(scanf("%d",&country),country) { road=country*(country-1)/2; for(i=1;i<=road;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); if(d==1) map[a][b]=map[b][a]=0;// 如果已经修好,则将距离设为零 else map[a][b]=map[b][a]=c; } prim(); } }
克鲁斯卡尔算法:
#include<stdio.h> #include<algorithm> using namespace std; #include<string.h> #define max 6000 #define ac 150 int road,country; int set[ac]; struct line { int start; int end; int dist; int condition; }num[max]; bool cmp(line a,line b)//排序,从小到大 { return a.dist<b.dist ; } int find(int p)//寻找根节点 { int t; int child=p; while(p!=set[p]) p=set[p]; while(child!=p) { t=set[child]; set[child]=p; child=t; } return p; } void merge(int x,int y)//合并 { int fx=find(x); int fy=find(y); if(fx!=fy) set[fx]=fy; } int main() { int i,j; while(scanf("%d",&country)!=EOF&&country) { int outcome=0; for(i=1;i<=country;i++) { set[i]=i; } road=country*(country-1)/2; for(i=1;i<=road;i++) { scanf("%d%d%d%d",&num[i].start ,&num[i].end ,&num[i].dist,&num[i].condition ); if(num[i].condition==1)// 如果已经修好,则将其合并 merge(num[i].start,num[i].end); } sort(num+1,num+1+road,cmp); for(i=1;i<=road;i++) { if(find(num[i].start)!=find(num[i].end))//判断是否成环 { merge(num[i].start ,num[i].end ); outcome+=num[i].dist ; } } printf("%d\n",outcome); } }
原题目:hdoj1879继续畅通工程
相关文章推荐
- 数据结构实验之链表一:顺序建立链表
- 【翻译】各种Payload免杀工具集
- ITA扩围,中国软件公司感受到压力了吗?
- SQL data reader reading data performance test
- HDFS副本放置策略和机架感知
- 数据结构_选择排序
- C#开发COM组件
- 第一次写这个
- Ubuntu搭建Android开发环境
- 怎么在win10的系统上加域?win10加域两种方法介绍
- 欢迎使用CSDN-markdown编辑器
- openwrt: Makefile 框架分析
- 01背包--小P寻宝记——粗心的基友
- js实现div弹出层的方法
- 前端笔记——jquery ajax提交表单
- 优步北京B组(8月10日-8月16日奖励规则)
- codeforces 567 E. President and Roads 【 最短路 桥 】
- Algorithms-98.Validate Binary Search Tree
- Linux电源管理(4)_Power Management Interface
- 设置android studio的背景色