hdu 1879 最小生成树 kruskal

继续畅通工程

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14910    Accepted Submission(s): 6458

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

题目很明显,就是变形的最小生成树

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define M 110
 6 #define X 5050
 7 struct villge
 8 {
 9     int a,b,money;
10 }N[X];///定义村庄结构体
11 int dis[M],sum;///用sum储存路程
12 bool vid[M];///因为路径较多所以建立一个标记数组来节约下时间
13 int find(int x)
14 {
15     int t=x;
16     while(dis[x]!=x)
17         x=dis[x];
18     dis[t]=x;
19     return x;
20 }
21 bool cmp(villge a,villge b)
22 {
23     return a.money<b.money;
24 }
25 void father(villge x)
26 {
27     int a=find(x.a);
28     int b=find(x.b);
29     if(a!=b)
30     {
31         sum+=x.money;
32         dis[a]=b;
33         vid[x.a]=1;
34         vid[x.b]=1;
35     }
36     return;
37 }
38 int main()
39 {
40     int i,j,n,t,a,b,c,d,x;
41     while(scanf("%d",&n)&&n)
42     {
43         for(i=0;i<M;i++)
44             dis[i]=i;
45         memset(vid,0,sizeof(vid));
46         sum=0;
47         t=n*(n-1)/2;
48         x=0;
49         for(i=0;i<t;i++)
50         {
51             scanf("%d%d%d%d",&a,&b,&c,&d);///并入
52             if(d){
53                 int q,w;
54                 q=find(a);
55                 w=find(b);
56                 if(q!=w)
57                     dis[q]=w;
58                 vid[a]=vid[b]=1;
59             }///这里题目是当d为1时代表已经建好的,必须先写入,这里我wa了2次
60             else{
61                 N[x].a=a;
62                 N[x].b=b;
63                 N[x++].money=c;
64             }
65         }
66         sort(N,N+x,cmp);
67         for(i=0;i<t;i++)
68         {
69             if(vid[N[i].a]!=1||vid[N[i].b]!=1)
70                 father(N[i]);
71         }
72         printf("%d\n",sum);
73     }
74     return 0;
75 }
76 /**********************************************
77 代码有点丑不要在意这些细节
78 ***********************************************/
时间: 2025-01-12 18:01:30

hdu 1879 最小生成树 kruskal的相关文章

hdu 1879 继续畅通工程 (最小生成树)

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12717    Accepted Submission(s): 5506 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出

HDU 1879 继续畅通工程

Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. Input测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N)

SOJ4339 Driving Range 最小生成树 kruskal算法

典型的最小生成树 然后求最大的一条边 附上链接 http://cstest.scu.edu.cn/soj/problem.action?id=4339 需要注意的是有可能有 "IMPOSSIBLE" 的情况 这里用一个flag标记 记录所并的节点 只有flag = n时才能成功 负责就 "IMPOSSIBLE" 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g

ZOJ 3204 Connect them (C) 最小生成树kruskal

Connect them Time Limit: 1 Second      Memory Limit: 32768 KB You have n computers numbered from 1 to n and you want to connect them to make a small local area network (LAN). All connections are two-way (that is connecting computers i and j is the sa

HDU2988 Dark roads 【最小生成树Kruskal】

Dark roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 583    Accepted Submission(s): 253 Problem Description Economic times these days are tough, even in Byteland. To reduce the operating

hdu 3371 最小生成树prim算法

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8992    Accepted Submission(s): 2519 Problem Description In 2100, since the sea level rise, most of the cities disappear. Thoug

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];

最小生成树 Kruskal算法

Kruskal算法 1.概览 Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪婪算法的应用.和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效. 2.算法简单描述 1).记Graph中有v个顶点,e个边 2).新建图Graphnew,Graphnew中拥有原图中相同的e个顶点,但没有边 3).将原图Graph中所有e个边按权值从小到大排序 4)

SDUT 2933-人活着系列之Streetlights(最小生成树Kruskal+并查集实现)

人活着系列之Streetlights Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 人活着如果是为了家庭,亲情----可以说是在这个世界上最温暖人心的,也是最让人放不下的,也是我在思索这个问题最说服自己接受的答案.对,也许活着是一种责任,为了繁殖下一代,为了孝敬父母,男人要养家糊口,女人要生儿育女,就这样循环的过下去,但最终呢?还是劳苦愁烦,转眼成空呀! 为了响应政府节约能源的政策,某市要对路灯进行改革,已知该市有n个城镇,