POJ 1751 Highways (kruskal)

来源:互联网 发布:mac sleep命令 编辑:程序博客网 时间:2024/05/14 11:44

题目链接:http://poj.org/problem?id=1751

题目大意:给出n个村庄的坐标 和已经了m条路  现在要求建最短的路  将所有村庄连起来  将这些路输出

思路;这题可以用kruskal来做    通过n个点  枚举出所有的边长建立图 然后kruskal的模板题

#include <iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<string.h>using namespace std;#define maxn 1010struct node{int x,y;}s[maxn];//村庄坐标int u[maxn*maxn/2],v[maxn*maxn/2],w[maxn*maxn/2];int r[maxn*maxn/2],pre[maxn*maxn/2];int find(int x){int r=x;while(pre[r]!=r){r=pre[r];}int i=x,j;while(i!=r){j=pre[i];pre[i]=r;i=j;}return r;}int dis(int x1,int y1,int x2,int y2){return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);}bool cmp(int x,int y){return w[x]<w[y];}void join(int x,int y){int fx=find(x),fy=find(y);if(fx!=fy){pre[fx]=fy;}}void init(){int m;scanf("%d",&m);while(m--){int a,b;scanf("%d%d",&a,&b);join(a,b);}}bool check(int n){int ans=find(1);for(int i=2;i<=n;i++)if(find(i)!=ans)return false;return true;}void kruskal(int n,int t){for(int i=1;i<=n;i++){pre[i]=i;}for(int i=0;i<t;i++)r[i]=i;sort(r,r+t,cmp);init();for(int i=0;i<t;i++){int e=r[i],x=find(u[e]),y=find(v[e]);if(x!=y)//如果不在一个集合之中  在将其将入并入一个集合  同时输出这条边{pre[x]=y;printf("%d %d\n",u[e],v[e]);}if(check(n))//检验是否已经都在一个集合之中break;}}int main(){int a,b;int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&s[i].x,&s[i].y);}int t=0;for(int i=1;i<=n;i++)//任意两个城市之间的距离{for(int j=i+1;j<=n;j++){u[t]=i,v[t]=j,w[t]=dis(s[i].x,s[i].y,s[j].x,s[j].y);t++;}}kruskal(n,t);return 0;}


原创粉丝点击