POJ 1751 Highways(kuangbin带你飞 专题六:最小生成树)

来源:互联网 发布:网络拒绝接入怎么解决 编辑:程序博客网 时间:2024/06/05 15:54

题意就是给定n个村庄的坐标,然后要求从某个城市出发能到达任意一个其他城市...其中某些公路已经建好,问还需要建哪些公路使得总代价最小...不用输出代价..输出需要建造公路的两个顶点编号...如果已经全部联通,输出为空,因为是spj,所以可以随便输出

kruskal解得....因为只会这一个玩意..所以就慢慢写,没想到在VJ上1A了...然后回到POJ c++ tle...G++ 560MS...不懂为何有这么大偏差..很水的一个题目

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>using namespace std;int f[760],n,x[760],y[760];struct node{    int x,y;    double s;}s[540000];int cmp(node a,node b){    return a.s<b.s;}void inti(){    for(int i=1;i<=n;i++)        f[i]=i;}int find(int x){    if(x!=f[x])        return f[x]=find(f[x]);    return x;}int main(){    while(scanf("%d",&n)!=EOF)    {        inti();        for(int i=1;i<=n;i++)        {            scanf("%d %d",&x[i],&y[i]);        }        int k=0;        for(int i=1;i<=n;i++)        {            for(int j=i+1;j<=n;j++)            {                s[k].x=i,s[k].y=j;                s[k++].s=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+0.0);            }        }        sort(s,s+k,cmp);        int m,u,v,t=0;        scanf("%d",&m);        for(int i=0;i<m;i++)        {            scanf("%d %d",&u,&v);            int du=find(u);            int dv=find(v);            if(du!=dv)            {                t++;                f[du]=dv;            }        }        for(int i=0;i<k;i++)        {            int dx=find(s[i].x);            int dy=find(s[i].y);            if(dx!=dy)            {                t++;                printf("%d %d\n",s[i].x,s[i].y);                f[dy]=dx;            }            if(t==n-1)                break;        }    }    return 0;}


0 0
原创粉丝点击