继续畅通project

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 14309    Accepted Submission(s): 6228

Problem Description
省政府“畅通project”的目标是使全省不论什么两个村庄间都能够实现公路交通(但不一定有直接的公路相连,仅仅要能间接通过公路可达就可以)。现得到城镇道路统计表,表中列出了随意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编敲代码,计算出全省畅通须要的最低成本。
 
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
#include <stdio.h>
#include<string.h>
#include <algorithm>
using namespace std;
typedef struct Road
{
int c1, c2, cost, state;
}Road; bool myCompare(const Road &a, const Road &b)
{
if(a.cost < b.cost)
return 1;
return 0;
} Road road[5051];
int city[101]; int Find(int n)
{
if(city[n] == -1)
return n;
return city[n] = Find(city[n]);
} bool Merge(int s1, int s2)
{
int r1 = Find(s1);
int r2 = Find(s2);
if(r1 == r2)
return 0;
if(r1 < r2)
city[r2] = r1;
else
city[r1] = r2;
return 1;
} int main()
{
//freopen("input.txt", "r", stdin);
int n;
while(scanf("%d", &n) && n)
{
int m = n*(n-1)/2;
memset(city, -1, sizeof(city));
int count = 0;
for(int i=0; i<m; ++i)
{
scanf("%d %d %d %d", &road[i].c1, &road[i].c2, &road[i].cost, &road[i].state);
if(road[i].state == 1)
{
count ++;
Merge(road[i].c1, road[i].c2);
}
}
sort(road, road+m, myCompare);
int sum = 0;
for(int i=0; i<m; ++i)
{
if(Merge(road[i].c1, road[i].c2) && road[i].state == 0)
{
count ++;
sum += road[i].cost;
}
if(count == n-1)
break;
}
printf("%d\n", sum);
}
return 0;
}

#include <stdio.h>
#include<string.h>
#include <algorithm>
int city[5000];
using namespace std;
struct Road
{
int c1;
int c2;
int cost;
int state;
};
Road road[110]; bool cmp(Road a,Road b)
{
if(a.cost<b.cost)
return 1;
return 0;
}
int find(int a)
{
if(city[a]==-1)
return a;
return city[a]=find(city[a]);
}
bool merge(int x, int y)
{
int fx,fy;
fx = find(x);
fy = find(y);
if(fx == fy) return 0;
else if(fx < fy) //不能省去
city[fy] = fx;
else
city[fx] = fy;
return 1;
} int main()
{
int n, m;
while(scanf("%d",&n),n)
{
m=n*(n-1)/2;
int i;
int count = 0;
int sum = 0;
memset(city,-1,sizeof(city)); for(i=0; i<m; i++)
{
scanf("%d %d %d %d",&road[i].c1, &road[i].c2, &road[i].cost, &road[i].state);
if(road[i].state == 1)
{
count ++;
merge(road[i].c1, road[i].c2);
}
}
sort(road, road+m,cmp); for(i=0; i<m; i++)
{
if(merge(road[i].c1, road[i].c2) && road[i].state==0)
{
count ++;
sum += road[i].cost;
}
if(count == n-1)
break;
}
printf("%d\n",sum);
}
return 0;
}

HDoj-1879-畅通project-并查集的更多相关文章

  1. HDU1232 畅通project 并查集

    这道题跟HDU 1213 How Many Tables 并查集很接近,都是赤裸裸的并查集的题. 思路:如果还须要建n-1条路.每并一次就自减1. 參考代码: #include<stdio.h& ...

  2. HDU1232 畅通工程 并查集

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. ACM: 继续畅通工程-并查集-最小生成树-解题报告

    继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descri ...

  4. ACM: 畅通工程-并查集-解题报告

    畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查城镇交通状况 ...

  5. B - 畅通工程(并查集)

    对并查集理解之后就可以做这种题了,虽说这种题做的不多,这道题做过才这么快搞定,可是还是挺happy滴,加油 Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接 ...

  6. NSOJ 畅通工程(并查集)

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  7. hdu 1233 还是畅通工程 并查集or最小生成树

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路 ...

  8. hdu1232 畅通工程 并查集的 应用

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  10. HDU - 1232 畅通工程-并查集模板

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

随机推荐

  1. 内网port映射具体解释(花生壳)

    关于怎样建立服务器的解答. 一.花生壳的作用 首先,我们先来了解一下花生壳的究竟有什么作用.由于ADSL每次拨号上网所获得的IP地址每次都是不同的,花生壳起到的作用就是方便用户訪问我们的server( ...

  2. Form表单中的action路径问题

    今天刚接触web,在用jsp和servlet做一个简单的登陆的时候在Form表单action属性和method属性的一些问题:  我遇到的是Form表单提交到servelet处理时遇到的问题:  (1 ...

  3. libyuv编

     下载代码(墙): git clone http://git.chromium.org/external/libyuv.git 用 make 编译(linux.mingw.cygwin): mak ...

  4. 在SQLAlter在现场一定的价值

    update AA set aa = replace(aa,'1234','规范') where aa like '%1234%'

  5. C语言中的函数指针

    C语言中的函数指针 函数指针的概念:   函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...

  6. NOI 评价体系 arbiter 安装方法 常见的问题 移植

    #!/bin/bash AppPath="$PWD"   读取当前文件夹 echo "Arbiter is installing..." sudo apt-ge ...

  7. 初探ExtJS(2)

    二.建立第一个Demo.实现查数据库显示到页面 步骤:1.建立MySQL数据库表 2.整合SSH框架 3.用ExtJS显示 关键注意事项: Ext.data.JsonReader中root的含义,比如 ...

  8. Nutch 二次开发parse纸

    大约nutch基础知识可以参考lemo柱 nutch支持二次开发,为了满足搜索的准确性的问题,内容提取出来作为索引的内容,相应的是parse_text的数据.我使用的事nutch1.4 版本号,在cy ...

  9. myeclipse如何恢复已删除的文件和代码

    这是一篇文章分享秘诀:myeclipse恢复意外删除的文件和代码 [ 恢复误删文件 ] 今天在写代码的时候,不小心把一个包给删除了,然后这个包下全部的文件都没了,相信非常多人都有类似的经历. 幸好my ...

  10. 【转】c#实现字符串倒序的n种写法

    其中LINQ写法最为简洁 //string concatenation with for loop public string ReverseA(string text) {     char[] c ...