POJ 1751 Highways (最小生成树+记录路径)
2014-09-17 19:42
375 查看
题目链接:POJ 1751 Highways
题意:给出N个点的坐标和M条边,这M条边的边权为0,求这N个点的最小生成树,并输出路径。
挺果的最小生成树,Prim和Kruskal,都可以Prim跑的快些。
Kruskal
AC代码:
Prim
AC代码:
题意:给出N个点的坐标和M条边,这M条边的边权为0,求这N个点的最小生成树,并输出路径。
挺果的最小生成树,Prim和Kruskal,都可以Prim跑的快些。
Kruskal
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=800; const int maxm=1000; struct Point { int x,y; }; struct Point p[maxn]; struct Edge { int x,y; int s; bool operator<(const Edge &cmp)const{ return s<cmp.s; } }; struct Edge E[maxn*maxn+maxm]; int father[maxm]; int dist(Point a,Point b) { Point c; c.x=a.x-b.x; c.y=a.y-b.y; return c.x*c.x+c.y*c.y; } int find(int x) { if(x==father[x]) return x; return father[x]=find(father[x]); } void Kusal(int k) { int i,fx,fy; for(i=0;i<k;i++) { fx=find(E[i].x); fy=find(E[i].y); if(fx!=fy) { father[fx]=fy; if(E[i].s!=0) printf("%d %d\n",E[i].x,E[i].y); } } } int main() { int i,j; int n,m,h; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) father[i]=i; for(i=1;i<=n;i++) scanf("%d %d",&p[i].x,&p[i].y); int cnt=0; scanf("%d",&h); for(cnt=0;cnt<h;cnt++) { scanf("%d %d",&E[cnt].x,&E[cnt].y); E[cnt].s=0; } for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { E[cnt].x=i; E[cnt].y=j; E[cnt++].s=dist(p[i],p[j]); E[cnt].x=j; E[cnt].y=i; E[cnt++].s=dist(p[i],p[j]); } } sort(E,E+cnt); Kusal(cnt); } return 0; } /* 4 0 0 1 2 3 4 5 6 0 3 1 2 2 3 3 4 0 */
Prim
AC代码:
#include<string.h> #include<math.h> #include<set> #include<algorithm> using namespace std; double map[751][751]; const double inf=99999999.0; int pre[751]; void Prim(int n) { int i,j,min_i; double min,sum=0; double dis[751]; int vis[751]; for(i=1;i<=n;i++) { dis[i]=map[i][1]; if(dis[i]==inf) pre[i]=0; else pre[i]=1; } memset(vis,false,sizeof vis); vis[1]=true; for(i=1;i<n;i++) { min=inf,min_i=i; for(j=1;j<=n;j++) { if(!vis[j] && dis[j]<min) { min=dis[j]; min_i=j; //printf("%d...%d\n",min_i,j); } } if(min!=0) //最小生成树的路径记录 printf("%d %d\n",pre[min_i],min_i); if(min==inf) break; sum+=min; vis[min_i]=true; for(j=1;j<=n;j++) { if(!vis[j] && dis[j]>map[min_i][j]) { dis[j]=map[min_i][j]; pre[j]=min_i;//记录前驱。 } } } //printf("%.2lf\n",sum); } int main() { int n,m; int a[751],b[751],i,j; int x,y; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d %d",&a[i],&b[i]); int cnt=0; for(i=1;i<=n;i++) { for(j=1;j<i;j++) { if(i==j) map[i][j]=inf; else map[i][j]=map[j][i]=sqrt(1.0*(a[i]-a[j])*(a[i]-a[j])+1.0*(b[i]-b[j])*(b[i]-b[j])); } } scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d %d",&x,&y); map[x][y]=map[y][x]=0; } Prim(n); } return 0; }
相关文章推荐
- POJ ~ 1751 ~ Highways (最小生成树 + 打印路径)
- POJ 1751 Highways【最小生成树+输出路径】
- 分量算法poj 1751 Highways 最小生成树之Kruskal(克鲁斯卡尔)算法
- POJ 1751 Highways(最小生成树)
- POJ1751 Highways(最小生成树)(prim)
- POJ 1751 Highways 最小生成树
- poj 1751 Highways(最小生成树)
- poj 1751 Highways(最小生成树)
- poj1751 Highways(最小生成树)
- POJ-1751-Highways(普利姆 打印最小生成树的边)
- poj 1751 highways 最小生成树
- POJ 1751 Highways(最小生成树+剪枝)
- POJ 1751 Highways(kuangbin带你飞 专题六:最小生成树)
- POJ:1751 Highways(最小生成树kruskal算法)
- POJ 1751 - Highways(最小生成树)
- poj-1751-Highways-(最小生成树)
- POJ 1751 Highways 最小生成树 Kruskal && Prim
- POJ 1751 Highways(最小生成树 prim算法)
- POJ 1751 Highways (Kruskal 最小生成树)
- poj 1751 Highways 最小生成树之Kruskal(克鲁斯卡尔)算法