POJ 1751 Highways

来源:互联网 发布:c语言两条竖线运算 编辑:程序博客网 时间:2024/05/01 05:07

//技巧:当G++超时时,用C++,当C++超时,用G++,二者换着试试,说不定就AC了//

AC代码(G++):

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 800int p[N];int n;int L;struct node{    int x,y,w,v,c;}t[N*N],T[N*N];int cmp(node p,node q){    return p.c<q.c;}int find(int k){    if(p[k]==k)    {        return p[k];    }    else    {        return find(p[k]);    }}void cl(){    int sum=0;    int i;    for(i=0;i<L;i++)    {        int x=find(T[i].w);        int y=find(T[i].v);        if(x!=y)        {            p[y]=x;            sum++;            printf("%d %d\n",T[i].w,T[i].v);        }        if(sum==n-1)            return;    }    return;}int main(){    scanf("%d",&n);    int i,j;    L=0;    for(i=1;i<=n;i++)    {        scanf("%d%d",&t[i].x,&t[i].y);        for(j=1;j<i;j++)        {            T[L].w=i;            T[L].v=j;            T[L].c=(t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y);            L++;        }        p[i]=i;    }    sort(T,T+L,cmp);    int m;    scanf("%d",&m);    int w1,w2;    int t1,t2;    for(i=0;i<m;i++)    {        scanf("%d%d",&w1,&w2);        t1=find(w1);        t2=find(w2);        if(t1!=t2)        {            p[t2]=t1;        }    }    cl();    return 0;}


0 0
原创粉丝点击