最小生成树模板题 HDU1875 畅通工程再续

这里写图片描述


调了好久,kruskal没过,也没找到原因,用prim过的


prim

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f
const int maxn = 110;
double lowcost[maxn], map[maxn][maxn];
double x[maxn], y[maxn], d;
bool visit[maxn];
int n, m;
int i, j;

void prim()
{
    double min, sum = 0; int p = 0;
    for (i = 1; i <= n; i++)
        lowcost[i] = map[1][i], visit[i] = 0;
    visit[1] = 1;
    for (i = 2; i <= n; i++)
    {
        min = inf; p = 0;
        for (j = 1; j <= n; j++)
        if (!visit[j] && min > lowcost[j])
            min = lowcost[j], p = j;
        if (min == inf)
        {
            cout << "oh!" << endl;
            return;
        }
        sum += min; visit[p] = 1;
        for (j = 1; j <= n; j++)
        if (!visit[j] && lowcost[j] > map[p][j])
            lowcost[j] = map[p][j];
    }
    printf("%.1lf\n", sum * 100);
}

int main()
{
    int t; cin >> t;
    while (t--)
    {
        cin >> n;
        for (i = 1; i <= n; i++)
        {
            scanf("%lf %lf", &x[i], &y[i]);
            for (j = 1; j <= n; j++)
            {
                if (i == j)
                    map[i][j] = 0;
                else
                    map[i][j] = inf;
            }
        }
        for (i = 1; i <= n; i++)
        for (j = i + 1; j <= n; j++)
        {
            d = sqrt((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j]));
            if (d >= 10 && d <= 1000)
            {
                if (d < map[i][j])
                    map[i][j] = map[j][i] = d;
            }
        }
        prim();
    }
    return 0;
}

kruskal
没找到错误。交上去wa

#define mem(a,b) memset(a,b,sizeof(a))
#include<bits/stdc++.h>
using namespace std;

const int INF=0x3f3f3f;
const int maxn=1010;
int n,m;
struct node
{
    int x,y;
    double w;
    node()
    {

    }
    node(int xx,int yy,float ww)
    {
        x=xx,y=yy,w=ww;
    }
    node(int xx,int yy)
    {
        x=xx,y=yy;
    }
};

bool operator <(const node a,const node b)
{
    return a.w>b.w;
}
int F[maxn];
int f(int x)
{
    if(x!=F[x])
        return F[x]=f(F[x]);
    return x;
}
bool Union(int x,int y)
{
    x=f(x),y=f(y);
    if(x!=y)
    {
        F[x]=y;
        return 1;
    }
    return 0;
}
void ini(int n)
{
    for(int i=1; i<=n; ++i)
        F[i]=i;
}
int main()
{
    int t;
    scanf("%d",&t);
    node edges[10100];
    while(t--)
    {
        mem(edges,0);
        int x,y,z;
        scanf("%d",&z);
        priority_queue<node>pq;
        for(int i=1; i<=z; ++i)
        {
            scanf("%d%d",&x,&y);
            edges[i]=node(x,y);
        }
        for(int i=1; i<z; ++i)
            for(int j=i+1; j<=z; ++j)
                pq.push(node(i,j,100*sqrt((edges[i].x-edges[j].x)*(edges[i].x-edges[j].x)+(edges[i].y-edges[j].y)*(edges[i].y-edges[j].y))));

        double ans=0;
        int cnt=0;
        ini(z);
        while(!pq.empty())
        {
            node tt=pq.top();
            pq.pop();
            //cout<<t.x<<":"<<f(t.x)<<endl;
            //cout<<t.y<<":"<<f(t.y)<<endl;
            if(tt.w>=1000&&tt.w<=100000)
            if(Union(tt.x,tt.y))//cout<<t.w<<" "<<t.x<<" "<<t.y<<endl,
               ++cnt,ans+=tt.w;
        }
        //for(int i=0;i<z;++i)
        //    if(F[i]==i)
        //        ++cnt;
        if(cnt!=z-1)
            puts("oh!");
        else
            printf("%.1f\n",ans);
    }
    system("pause");
    return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值