POJ 1751 Highways

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

AC代码(G++):

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 800
int 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;
}


你可能感兴趣的:(POJ 1751 Highways)