HDU--1233 -- 还是畅通工程 [kruskal算法] [prime算法] [并查集]
2013-08-05 20:32
609 查看
还是畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20030 Accepted Submission(s): 8884
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
Sample Output
3
5
HintHint
Huge input, scanf is recommended.
Code:
我类个乖!!
又折腾半天!
kruskal算法人家不把边加入的条件是此边和已定的边不能形成环,我还一直把参与的点都去掉了,老是被这么弱智的问题打败,,啊啊啊啊,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201711/cb4e94c34df3079bd70c302064bdba33.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201711/cb4e94c34df3079bd70c302064bdba33.gif)
感觉不会再爱了
最后还是用和并查集结合解决了, 爱世界的感觉还的接着找!!!
下面第一个是kruskal算法,再下面是纯纯的prime算法~
#include"stdio.h" #include"algorithm" #include"iostream" #include"string.h" using namespace std; int n; typedef struct node { int v1,v2; int length; }node; node set[5000]; int father[100]; bool cmp(node a,node b) { if(a.length<b.length) return true; return false; } int search(int n)//寻找父亲结点 { while(father !=n) n = father ; return father ; } int main() { int i,length; while(scanf("%d",&n),n)//输入并按照路径排序 { for(i=1;i<=n*(n-1)/2;i++) scanf("%d%d%d",&set[i].v1,&set[i].v2,&set[i].length); sort(set+1,set+n*(n-1)/2+1,cmp); for(i=1;i<=n;i++) father[i] = i; length = 0; for(i=1;i<=n*(n-1)/2;i++) { if(search(set[i].v1)!=search(set[i].v2))//如果两个点的父亲结点相同的话就相通不用修路了 { length += set[i].length; father[search(set[i].v1)] = set[i].v2; } } printf("%d\n",length); } return 0; }
下面from"手拎保龄球炮弹的pp"
#define N 101 #include <iostream> #include <stdio.h> using namespace std; int city ,road ; bool visit ; int sum,n; void Min(int count) { int i,j,last,m; m = 999999; for(i=1; i<=count; i++) { for(j=1;j<=n;j++) { if(!visit[j] && m>city[road[i]][j] && city[road[i]][j] != 0) { last = j; m = city[road[i]][j]; } } } sum += m; road[++count] = last; visit[last] = 1; } void Prim() { int i; for(i=1;i<=n;i++) visit[i] = 0; road[1] = 1;//从第一个城市开始 int count = 1; visit[1] = 1; while(count<n) { Min(count); count++; } } int main() { int i,j,a,b,c; while(scanf("%d",&n),n) { for(i=1;i<= n*(n-1)/2;i++) { scanf("%d%d%d",&a,&b,&c); city[a][b] = city[b][a] = c; } sum = 0; Prim(); printf("%d\n",sum); } return 0; }
我们的爱, 我明白,过了就不再回来,只是现在, 我还默默的等待~ 等待我的爱回来~
啊啊啊, 别那么笨了
相关文章推荐
- hdu 1233(还是畅通工程)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
- hdu 1233 还是畅通工程 最小生成树Kruskal算法(并查集)
- HDU 1233.还是畅通工程【最小生成树 kruskal算法(并查集)+prim算法】【1月8】
- hdu 题目1233 还是畅通工程 (Prime算法)
- hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
- HDU 1233 还是畅通工程 最小生成树K算法 并查集
- 【最小生成树】+【并查集】-HDU-1233-还是畅通工程
- HDU1233 还是畅通工程(并查集)
- HDU 1233 还是畅通工程 最小生成树Kruskal算法/并查集
- hdu-1233-还是畅通工程(普里姆(Prim)算法)
- HDU--1233--还是畅通工程--并查集
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
- HDU--1233:还是畅通工程 (并查集 & 最小生成树Prim)
- hdu——1233还是畅通工程(并查集 求最小路径长度 减枝)
- hdu 1233 还是畅通工程 (最小生成树,prim,优先队列,kruskal并查集)
- HDU - 1233 还是畅通工程(最小生成树kruskal算法)
- HDU 1233 还是畅通工程 (最小生成树、并查集)
- hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)
- 最小生成树 Kruscal与Prime HDU 1233 还是畅通工程 HDU 1301 Jungle Roads
- hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集