HDOJ---1233 还是畅通工程[Prim算法||Kruskal算法]
2012-07-31 21:43
746 查看
还是畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14115 Accepted Submission(s): 6435
[align=left]Problem Description[/align]
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
[align=left]Input[/align]
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
[align=left]Output[/align]
对每个测试用例,在1行里输出最小的公路总长度。
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
3 5
Hint
Hint
Huge input, scanf is recommended.
[align=left]Source[/align]
浙大计算机研究生复试上机考试-2006年
[align=left]Recommend[/align]
JGShining
Kruskal算法
code:
#include <iostream> #include <iomanip> #include <fstream> #include <sstream> #include <algorithm> #include <string> #include <set> #include <utility> #include <queue> #include <stack> #include <list> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <ctype.h> using namespace std; #define MAXN 101 int father[MAXN]; int n; int cnt; //已经选取的点的个数 int sum; //路径的长度 typedef struct edge { int x,y; int len; }Edge; Edge edge[MAXN*MAXN]; int cmp(const Edge &a,const Edge &b) { return a.len<b.len; } int findset(int v) { return father[v]; } void merget(int a,int b) { int i; for(i=1;i<=n;i++) if(father[i]==a) father[i]=b; } int main() { int i; int m; int tempx,tempy; while(~scanf("%d",&n),n) //n为村庄个数 { cnt=0; sum=0; m=((n-1)*n)>>1; //最多m条边 memset(edge,0,sizeof(edge)); for(i=1;i<=n;i++) father[i]=i; for(i=0;i<m;i++) scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].len); sort(edge,edge+i,cmp); //对边进行排序 for(i=0;i<m&&cnt!=n;i++) { tempx=findset(edge[i].x); tempy=findset(edge[i].y); if(tempx!=tempy) { merget(tempx,tempy); cnt++; sum+=edge[i].len; } } printf("%d\n",sum); } return 0; }
Prim算法:
code:
#include <iostream> #include <iomanip> #include <fstream> #include <sstream> #include <algorithm> #include <string> #include <set> #include <utility> #include <queue> #include <stack> #include <list> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <ctype.h> using namespace std; #define MAXN 101 int map[MAXN][MAXN]; int vst[MAXN]; int dis[MAXN]; int n; int prim() { int i,j,k; int min,sum=0; memset(vst,0,sizeof(vst)); for(i=1;i<=n;i++) dis[i]=map[1][i]; vst[1]=1; for(i=2;i<=n;i++) { k=1; min=INT_MAX; for(j=2;j<=n;j++) if(dis[j]<min&&!vst[j]) { min=dis[j]; k=j; } sum+=min; vst[k]=1; for(j=1;j<=n;j++) if(map[k][j]<dis[j]) dis[j]=map[k][j]; } return sum; } int main() { int i,j; int m; int tempx,tempy,templen; int cost; while(~scanf("%d",&n),n) { m=(n*(n-1))>>1; for(i=1;i<=m;i++) { scanf("%d%d%d",&tempx,&tempy,&templen); map[tempx][tempy]=templen; map[tempy][tempx]=templen; } printf("%d\n",prim()); } return 0; }
相关文章推荐
- HDU 1233 还是畅通工程 最小生成树Kruskal算法和prim算法
- hdoj 1233 还是畅通工程---最小生成树---Kruskal算法
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
- HDoj-1233-还是畅通工程-prim算法
- HDU 1233.还是畅通工程【最小生成树 kruskal算法(并查集)+prim算法】【1月8】
- 关于prim算法的讨论:例:HDOJ1233——还是畅通工程
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- HDOJ1233. 还是畅通工程(并查集+最小生成树)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- HDU 1233 还是畅通工程 (最小生成树----Kruskal算法)
- 还是畅通工程(2006浙江大学研究生上机复试题目[最小生成树] hdoj 1233)
- HDOJ 1233 还是畅通工程 (最小生成树)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- HDOJ 1233:还是畅通工程 普里姆算法求最小生成树
- 1233 还是畅通工程 prim算法
- hdoj 1233 还是畅通工程---最小生成树---prime算法
- HDOJ 1233 还是畅通工程(并查集)
- HDOJ还是畅通工程之--prim算法
- HDOJ 1233 还是畅通工程