最小生成树-还是畅通工程 (Kruskal和Prim算法)
2018-03-14 19:38
489 查看
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
Sample Output
Kruskal算法
//#include<stdio.h>
//#include<algorithm>
//using namespace std;
//int n;int pre[5050];
//void init()
//{
// for(int i=1;i<=n;i++)
// {
// pre[i]=i;
// }
//}
//int Find(int x)
//{
// int r=x;
// while(pre[r]!=r)
// {
// r=pre[r];
// }
// int i=x,j;
// while(pre[i]!=r)
// {
// j=pre[i];
// pre[i]=r;
// i=j;
// }
// return r;
//}
//int mix(int x,int y)
//{
// int fx=Find(x);
// int fy=Find(y);
// if(fx!=fy)
// {
// pre[fy]=fx;
// return 1;
// }
// return 0;
//}
//struct node
//{
// int u;
// int v;
// int w;
//}mapp[5050];
//bool cmp(node x,node y)
//{
// return x.w<y.w;
//}
//
//int main()
//{
// while(scanf("%d",&n)!=EOF)
// {
// int sum=0;
// int ant=0;
// if(n==0)
// return 0;
// int m=n*(n-1)/2;
// for(int i=1;i<=m;i++)
// {
// scanf("%d%d%d",&mapp[i].u,&mapp[i].v,&mapp[i].w);
// }
// init();
// sort(mapp+1,mapp+m+1,cmp);
// for(int i=1;i<=m;i++)
// {
// if(mix(mapp[i].u,mapp[i].v))
// {
// ant++;
// sum+=mapp[i].w;
// }
// if(ant==n-1)
// break;
// }
// printf("%d\n",sum);
// }
// return 0;
//}
//最小生成树_Prime算法
//#include<stdio.h>
//#include<string.h>
//#include<algorithm>
//#define inf 0x3f3f3f3f
//using namespace std;
//int n,minn;
//int mapp[120][120],dis[120],vis[120];
//int ant,sum;
//void prime()
//{
// vis[1]=1;
// ant++;
// int k;
// while(ant<n)
// {
// minn=inf;
// for(int i=1;i<=n;i++)//找到dis里面的最小的
// {
// if(!vis[i]&&dis[i]<minn)
// {
// minn=dis[i];
// k=i;
// }
// }
// vis[k]=1;
// ant++;
// sum+=dis[k];
// for(int j=1;j<=n;j++)
// {
// if(!vis[j]&&dis[j]>mapp[k][j])//更新生成树到非树顶点的距离
// dis[j]=mapp[k][j];
// }
// }
//}
//int main()
//{
// while(scanf("%d",&n)!=EOF)
// {
// ant=0;
// sum=0;
// memset(vis,0,sizeof(vis));
// int t1,t2,t3;
// if(n==0)return 0;
// int m=n*(n-1)/2;
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// {
// if(i==j)
// mapp[i][j]=0;
// else
// mapp[i][j]=inf;//建图
// }
// }
// for(int i=1;i<=m;i++)
// {
// scanf("%d%d%d",&t1,&t2,&t3);
// mapp[t1][t2]=t3;
// mapp[t2][t1]=t3;//存储无向图
// }
// for(int i=1;i<=n;i++)
// {
// dis[i]=mapp[1][i];
// }
// prime();
// printf("%d\n",sum);
// }
// return 0;
//}
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
Kruskal算法
//#include<stdio.h>
//#include<algorithm>
//using namespace std;
//int n;int pre[5050];
//void init()
//{
// for(int i=1;i<=n;i++)
// {
// pre[i]=i;
// }
//}
//int Find(int x)
//{
// int r=x;
// while(pre[r]!=r)
// {
// r=pre[r];
// }
// int i=x,j;
// while(pre[i]!=r)
// {
// j=pre[i];
// pre[i]=r;
// i=j;
// }
// return r;
//}
//int mix(int x,int y)
//{
// int fx=Find(x);
// int fy=Find(y);
// if(fx!=fy)
// {
// pre[fy]=fx;
// return 1;
// }
// return 0;
//}
//struct node
//{
// int u;
// int v;
// int w;
//}mapp[5050];
//bool cmp(node x,node y)
//{
// return x.w<y.w;
//}
//
//int main()
//{
// while(scanf("%d",&n)!=EOF)
// {
// int sum=0;
// int ant=0;
// if(n==0)
// return 0;
// int m=n*(n-1)/2;
// for(int i=1;i<=m;i++)
// {
// scanf("%d%d%d",&mapp[i].u,&mapp[i].v,&mapp[i].w);
// }
// init();
// sort(mapp+1,mapp+m+1,cmp);
// for(int i=1;i<=m;i++)
// {
// if(mix(mapp[i].u,mapp[i].v))
// {
// ant++;
// sum+=mapp[i].w;
// }
// if(ant==n-1)
// break;
// }
// printf("%d\n",sum);
// }
// return 0;
//}
//最小生成树_Prime算法
//#include<stdio.h>
//#include<string.h>
//#include<algorithm>
//#define inf 0x3f3f3f3f
//using namespace std;
//int n,minn;
//int mapp[120][120],dis[120],vis[120];
//int ant,sum;
//void prime()
//{
// vis[1]=1;
// ant++;
// int k;
// while(ant<n)
// {
// minn=inf;
// for(int i=1;i<=n;i++)//找到dis里面的最小的
// {
// if(!vis[i]&&dis[i]<minn)
// {
// minn=dis[i];
// k=i;
// }
// }
// vis[k]=1;
// ant++;
// sum+=dis[k];
// for(int j=1;j<=n;j++)
// {
// if(!vis[j]&&dis[j]>mapp[k][j])//更新生成树到非树顶点的距离
// dis[j]=mapp[k][j];
// }
// }
//}
//int main()
//{
// while(scanf("%d",&n)!=EOF)
// {
// ant=0;
// sum=0;
// memset(vis,0,sizeof(vis));
// int t1,t2,t3;
// if(n==0)return 0;
// int m=n*(n-1)/2;
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// {
// if(i==j)
// mapp[i][j]=0;
// else
// mapp[i][j]=inf;//建图
// }
// }
// for(int i=1;i<=m;i++)
// {
// scanf("%d%d%d",&t1,&t2,&t3);
// mapp[t1][t2]=t3;
// mapp[t2][t1]=t3;//存储无向图
// }
// for(int i=1;i<=n;i++)
// {
// dis[i]=mapp[1][i];
// }
// prime();
// printf("%d\n",sum);
// }
// return 0;
//}
相关文章推荐
- HDU 1233-还是畅通工程(经典的最小生成树, Kruskal和prim算法)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- 杭电 1233 还是畅通工程 【最小生成树&&Kruskal】
- 【最小生成树+kruskal】杭电 hdu 1233 还是畅通工程
- hdu1233 - 还是畅通工程 (求最小生成树)(Kruskal)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- hdoj 1233 还是畅通工程【最小生成树 kruskal && prim】
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- HDOJ 1233 还是畅通工程 最小生成树 kruskal && prim
- hdu1233 还是畅通工程 (kruskal求最小生成树)
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
- HDU - 1233 [还是畅通工程 ] 最小生成树Kruskal
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- hud1233还是畅通工程并 最小生成树 Prim算法
- HDU 1233 还是畅通工程 (最小生成树 Kruskal)
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- HDU1233--还是畅通工程--最小生成树--kruskal