HDU1879继续畅通工程

    xiaoxiao2026-08-26  2

    继续畅通工程

    时间限制: 1000ms 内存限制: 32768KB HDU       ID:  1879 64位整型:      Java 类名: 上一题   提交   运行结果   统计   讨论版   下一题
    类型:  没有   没有 难度     lv.1      lv.2      lv.3     lv.4      lv.5     lv.6      lv.7     lv.8      lv.9     lv.10  搜索 数据结构  动态规划 STL练习  高精度计算 图论  几何 数学 矩阵计算  入门题目 字符串  博弈论                   添加

    题目描述

    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。

    输入

    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。 当N为0时输入结束。

    输出

    每个测试用例的输出占一行,输出全省畅通需要的最低成本。

    样例输入

    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

    样例输出

    3 1 0

    来源

    浙大计算机研究生复试上机考试-2008年 //这道题跟我写的前几个畅通工程差别较大,此题需要在输入时进行初始化,把已修过的路放到一个集合里,避免查找时出现回路的qingkuan

    <span style="font-family:Times New Roman;font-size:18px;">#include<stdio.h> #include<algorithm> using namespace std; int n,m,pre[110]; struct road { int a,b,l,f; } s[5000]; bool cmp(road A,road B) { return A.l<B.l; } int find(int i) { if(pre[i]==i) return i; return pre[i]=find(pre[i]); } int main() { int i,j,tx,ty; while(scanf("%d",&n)&&n) { m=n*(n-1)/2; for(i=1; i<=n; i++) pre[i]=i; for(i=1; i<=m; i++) { scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].l,&s[i].f); if(s[i].f==1) { tx=find(s[i].a); ty=find(s[i].b); if(tx!=ty) pre[tx]=ty; } } sort(s+1,s+m+1,cmp); int count=0,sum=0; for(i=1; i<=m; i++) { if(s[i].f==0) { tx=find(s[i].a); ty=find(s[i].b); if(tx!=ty) { pre[tx]=ty; count++; sum+=s[i].l; } } if(count==n-1) break; } printf("%d\n",sum); } return 0; }</span>

    转载请注明原文地址: https://ju.6miu.com/read-1311588.html
    最新回复(0)