zoukankan      html  css  js  c++  java
  • POJ1751--Highways(最小生成树,kauskal)

    裸最小生成树。用kauskal做方便一些。

    不得不说这么大数据用cin cout 真是作死。。活该T那么多次。。。

    /*************************************************
    Problem: 1751		User: G_lory
    Memory: 4640K		Time: 594MS
    Language: C++		Result: Accepted
    *************************************************/
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    const int MAXN = 755;
    const int MAXM = MAXN * MAXN;
    
    int par[MAXN];
    int rk[MAXN];
    
    struct Edge
    {
        int u, v;
        double w;
        bool operator<(const Edge a) const
        {
            return w < a.w;
        }
    } edge[MAXM];
    
    int tol;
    
    void addedge(int u, int v, double w)
    {
        edge[tol].u = u;
        edge[tol].v = v;
        edge[tol++].w = w;
    }
    
    void init(int n)
    {
        for (int i = 0; i <= n; ++i)
        {
            rk[i] = 0;
            par[i] = i;
        }
    }
    
    int find(int x)
    {
        if (par[x] == x) return x;
        return par[x] = find(par[x]);
    }
    
    void unite(int x, int y)
    {
        x = find(x);
        y = find(y);
        if (x == y) return ;
        if (rk[x] < rk[y]) par[x] = y;
        else par[y] = x;
        if (rk[x] == rk[y]) rk[x]++;
    }
    
    void Kruskal(int n, int m)
    {
        sort(edge, edge + tol);
        int cnt = 0;
        for (int i = 0; i < tol; i++)
        {
            int t1 = find(edge[i].u);
            int t2 = find(edge[i].v);
            if (t1 != t2)
            {
                cout << edge[i].u << " " << edge[i].v << endl;
                unite(t1, t2);
                cnt++;
            }
            if (cnt == n - 1 - m) break;
        }
    }
    
    struct Point {
        double x, y;
        double dis(Point a)
        {
            return sqrt( (x - a.x) * (x - a.x) + (y - a.y) * (y - a.y) );
        }
    } p[MAXN];
    
    int main()
    {
        int n, m;
        scanf("%d", &n);
        tol = 0;
        for (int i = 1; i <= n; ++i)
            scanf("%lf%lf", &p[i].x, &p[i].y);
        for (int i = 1; i <= n; ++i)
            for (int j = i + 1; j <= n; ++j)
                addedge(i, j, p[i].dis(p[j]));
        init(n);
        scanf("%d", &m);
        int a, b;
        int p = 0;
        for (int i = 0; i < m; ++i)
        {
            scanf("%d%d", &a, &b);
            if (find(a) != find(b))
            {
                unite(a, b);
                ++p;
            }
        }
        Kruskal(n, p);
        return 0;
    }
    

      

  • 相关阅读:
    团队服务器搭建(搭建php环境和安装在线mysql管理工具phpmyadmin)
    游戏交流社区的构思
    脚本实现在线黄金点游戏,支持多用户,不重复,防机器等功能
    LogFilter
    XML
    Java互联网应用和企业级应用的区别
    Java小目标
    JAVA集合类
    黄金点游戏
    WordCount
  • 原文地址:https://www.cnblogs.com/wenruo/p/4946387.html
Copyright © 2011-2022 走看看