最小生成树  自己太死板了!老是RE 最后才发现数组开小了!将已连接的点的权值赋值为零就好了

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define N 150000
#define M 755

using std::sort;

struct dat
{
    int nx;
    int ny;
    double nl;
    bool operator <(const dat p)const
    {
        return  nl<p.nl;
    }
} a[600000];
double point[M][2];
bool vis[M][M];
int n,m,t;
int p[N];
void solve()
{
    m=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=i+1; j<=n; j++)
        {
            if(vis[i][j])
                a[m].nl=0.0;
            else
            {
                double x=point[i][0]-point[j][0];
                double y=point[i][1]-point[j][1];
                a[m].nl=(double)sqrt(x*x+y*y);
            }
            a[m].nx=i;
            a[m++].ny=j;
        }
    }
    sort(a,a+m);
    for(int i=1; i<=n; i++)
        p[i]=i;
}
int find(int x)
{
    return p[x]==x?x:p[x]=find(p[x]);
}
int main()
{
    while(scanf("%d",&n)==1)
    {
        for(int i=1; i<=n; i++)
            scanf("%lf %lf",&point[i][0],&point[i][1]);
        scanf("%d",&t);
        int d,c;
        memset(vis, false, sizeof(vis));
        for(int i=0; i<t; i++)
        {
            scanf("%d %d",&d,&c);
            vis[d][c]=vis[c][d]=true;
        }
        solve();
        double sum=0;
        for(int i=0; i<m; i++)
        {
            int x=find(a[i].nx);
            int y=find(a[i].ny);
            if(x!=y)
            {
                sum+=a[i].nl;
                p[x]=y;
            }
        }
        printf("%.2lf\n",sum);
    }
    return 0;
}
View Code

 

posted on 2013-08-03 12:46  风流monkey  阅读(116)  评论(0)    收藏  举报