hdoj 1879 继续畅通工程 【最小生成树】
2015-01-31 14:00
351 查看
继续畅通工程
[b]Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15060 Accepted Submission(s): 6515
[/b]
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
附上两种代码:
kruskal(我的最爱):
#include<stdio.h> #include<algorithm> #define max 50*99+10 using namespace std; int set[110]; struct line { int start; int end; int money; int exist; }num[max]; bool cmp(line a,line b) { return a.money<b.money; } int find(int p) { int child=p; int t; 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 city,road,need; int i,j,x,y; while(scanf("%d",&city)&&(city!=0)) { for(i=1;i<=city;i++) set[i]=i; road=city*(city-1)/2; for(i=0;i<road;i++) { scanf("%d%d%d%d",&num[i].start,&num[i].end,&num[i].money,&num[i].exist); if(num[i].exist) merge(num[i].start,num[i].end); } sort(num,num+road,cmp); need=0; for(i=0;i<road;i++) { if(find(num[i].start)!=find(num[i].end)) { merge(num[i].start,num[i].end); need+=num[i].money; } } printf("%d\n",need); } return 0; }
prime算法:
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f #define max 100+10 int lowcost[max],map[max][max],visit[max]; int city,road; int prime() { int i,j,next; int min; int mincost=0; memset(visit,0,sizeof(visit)); for(i=1;i<=city;i++) { lowcost[i]=map[1][i]; } visit[1]=1; for(i=1;i<city;i++) { min=INF; for(j=1;j<=city;j++) { if(!visit[j]&&min>lowcost[j]) { min=lowcost[j]; next=j; } } if(min==INF) break; mincost+=min; visit[next]=1; for(j=1;j<=city;j++) { if(!visit[j]&&lowcost[j]>map[next][j]) { lowcost[j]=map[next][j]; } } } return mincost; } int main() { int i,j,need; int a,b,c,exist; while(scanf("%d",&city)&&(city!=0)) { memset(map,INF,sizeof(map)); road=city*(city-1)/2; for(i=0;i<road;i++) { scanf("%d%d%d%d",&a,&b,&c,&exist); if(exist) map[a][b]=map[b][a]=0; else map[a][b]=map[b][a]=c; } need=prime(); printf("%d\n",need); } return 0; }
相关文章推荐
- 最小生成树 普利姆算法 HDOJ 1879 继续畅通工程
- 继续畅通工程(2008浙江大学研究生复试上机题[最小生成树] hdoj 1879 )
- HDOJ 继续畅通工程 1879(最小生成树)
- 【hdoj 1879】最小生成树----继续畅通工程
- HDOJ 1879 继续畅通工程(最小生成树)
- HDOJ题目1879继续畅通工程(基础最小生成树)
- 图论入门,Prim算法求最小生成树代价,HDOJ 1879 继续畅通工程
- HDOJ 1879 继续畅通工程 (最小生成树)
- hdoj 1879 继续畅通工程 【最小生成树】
- hdoj 1879 继续畅通工程 【最小生成树】
- HDOJ 1879 继续畅通工程(最小生成树--kruskal)
- HDOJ 1879 继续畅通工程 最小生成树 kruskal && prim
- hdu 1879 继续畅通工程 最小生成树
- HDU1879 继续畅通工程 【最小生成树Prim】
- hdu 1879 继续畅通工程 最小生成树
- hdu 1879 继续畅通工程 (并查集+最小生成树)
- hdu 1879 继续畅通工程 最小生成树
- HDU 1879 继续畅通工程(最小生成树 Kruskal算法)
- 杭电1879--继续畅通工程(最小生成…
- hdu 1879——继续畅通工程 最小生成树