UESTC 1146 秋实大哥与连锁快餐店 最小生成树、Prim

ProLightsfx 2016-7-31 152 7/31

秋实大哥与连锁快餐店 最小生成树、Prim

Source

2015 UESTC Training for Graph Theory
The question is from
here.

My Solution

最小生成树 Prim算法 O(n^2);
旗舰店与旗舰店距离为0;
TLE(3000ms) 了好多次,实验了各种改进,最后把直接求欧几里得距离的平方改成用 pow() 平方就 614 ms Accepted了……
这里算距离用至少N^2/2次,所以sqrt()也要这么多次,所以直接平方改用pow 平方就快出了好多(555555.............暂时只能这么解释了吧)
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 6669, INF = 0x3f3f3f3f;
int n;
//
struct point {
    int x, y, condi;
} po[maxn];
//
double dis[maxn];
bool v[maxn];
                                    //this problem is unique,so we don't use the vector g[maxn]

inline double getdist(point a,point b)
{
    return sqrt(pow(a.x-b.x,2) + pow(a.y-b.y,2));
}

double prim()
{
    memset(v, 0, sizeof v);
    for(int i = 1; i <= n; i++) dis[i] = INF;
    dis[1] = 0;
    double ans = 0;
    for(int i = 1; i <= n; i++){
        int mark = -1;
        for(int j = 1; j <= n; j++) if(!v[j]){
            if(mark == -1) mark = j;
            else if(dis[j] < dis) mark = j;
        }

        if(mark == -1) break;                       //all vertices are marked
        v = 1;
        ans += dis;

        for(int j = 1; j <= n; j++){
            if(j == mark) continue;
            if(!v[j]){
                dis[j] = min(dis[j], (po.condi==1 && po[j].condi==1) ? 0 : getdist(po,po[j]) );
            }
        }
    }
    return ans;
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d%d%d", &po[i].x, &po[i].y, &po[i].condi);
    }
    printf("%.2f", prim());
    return 0;
}

 


非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/

Thank you!

                                                                                                                                             ------from ProLightsfx

- THE END -

ProLightsfx

11月15日21:16

最后修改:2024年11月15日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论