zoukankan      html  css  js  c++  java
  • [HAOI2006]聪明的猴子 BZOJ 2429 Kruskal

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<map>
    #include<set>
    #include<vector>
    #include<queue>
    #include<bitset>
    #include<ctime>
    #include<deque>
    #include<stack>
    #include<functional>
    #include<sstream>
    //#include<cctype>
    //#pragma GCC optimize(2)
    using namespace std;
    #define maxn 200005
    #define inf 0x7fffffff
    //#define INF 1e18
    #define rdint(x) scanf("%d",&x)
    #define rdllt(x) scanf("%lld",&x)
    #define rdult(x) scanf("%lu",&x)
    #define rdlf(x) scanf("%lf",&x)
    #define rdstr(x) scanf("%s",x)
    typedef long long  ll;
    typedef unsigned long long ull;
    typedef unsigned int U;
    #define ms(x) memset((x),0,sizeof(x))
    const long long int mod = 1e9;
    #define Mod 1000000000
    #define sq(x) (x)*(x)
    #define eps 1e-11
    typedef pair<int, int> pii;
    #define pi acos(-1.0)
    //const int N = 1005;
    #define REP(i,n) for(int i=0;i<(n);i++)
    typedef pair<int, int> pii;
    
    inline int rd() {
    	int x = 0;
    	char c = getchar();
    	bool f = false;
    	while (!isdigit(c)) {
    		if (c == '-') f = true;
    		c = getchar();
    	}
    	while (isdigit(c)) {
    		x = (x << 1) + (x << 3) + (c ^ 48);
    		c = getchar();
    	}
    	return f ? -x : x;
    }
    
    
    ll gcd(ll a, ll b) {
    	return b == 0 ? a : gcd(b, a%b);
    }
    int sqr(int x) { return x * x; }
    
    
    
    /*ll ans;
    ll exgcd(ll a, ll b, ll &x, ll &y) {
    	if (!b) {
    		x = 1; y = 0; return a;
    	}
    	ans = exgcd(b, a%b, x, y);
    	ll t = x; x = y; y = t - a / b * y;
    	return ans;
    }
    */
    
    
    int m;
    double rg[maxn<<2];
    int n;
    struct node {
    	int x, y;
    	double d;
    }a[maxn<<2],e[maxn<<2];
    
    int fa[maxn<<2];
    void init() {
    	for (int i = 0; i <= n; i++)fa[i] = i;
    }
    double dis(int a, int b, int x, int y) {
    	return 1.0*sqrt((a - x)*(a - x) + (b - y)*(b - y));
    }
    
    int findfa(int x) {
    	if (x == fa[x])return x;
    	return fa[x] = findfa(fa[x]);
    }
    
    void merge(int p, int q) {
    	int u = findfa(p);
    	int v = findfa(q);
    	if (u != v)fa[u] = v;
    }
    double ans = 0;
    int tot = 0;
    bool cmp(node a, node b) {
    	return a.d < b.d;
    }
    void kruskal() {
    	int cnt = 0;
    	for (int i = 1; i <= tot; i++) {
    		int u = e[i].x;
    		int v = e[i].y;
    		double d = e[i].d;
    		if (findfa(u) != findfa(v)) {
    			merge(u, v);
    			ans = max(ans, d);
    			cnt++;
    			if (cnt >= n - 1)break;
    		}
    	}
    }
    
    int main() {
    //	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    	m = rd();
    	for (int i = 1; i <= m; i++)rdlf(rg[i]);
    	n = rd(); init();
    	for (int i = 1; i <= n; i++)rdint(a[i].x), rdint(a[i].y);
    	
    	for (int i = 1; i <= n; i++) {
    		for (int j = i + 1; j <= n; j++) {
    			e[++tot].x = i;
    			e[tot].y = j;
    			e[tot].d = 1.0*dis(a[i].x, a[i].y, a[j].x, a[j].y);
    		}
    	}
    	sort(e + 1, e + 1 + tot, cmp);
    	kruskal();
    	int num = 0;
    	for (int i = 1; i <= m; i++) {
    		if (rg[i] >= ans)num++;
    	}
    	cout << num << endl;
    	return 0;
    }
    
    EPFL - Fighting
  • 相关阅读:
    【NOIP2007】守望者的逃离
    20200321(ABC)题解 by 马鸿儒 孙晨曦
    20200320(ABC)题解 by 王一帆
    20200319(ABC)题解 by 王一帆 梁延杰 丁智辰
    20200314(ABC)题解 by 董国梁 蒋丽君 章思航
    20200309(ABC)题解 by 梁延杰
    20200307(DEF)题解 by 孙晨曦
    20200306(ABC)题解 by 孙晨曦
    20200305(DEF)题解 by 孙晨曦
    20200303(ABC)题解 by 王锐,董国梁
  • 原文地址:https://www.cnblogs.com/zxyqzy/p/10338303.html
Copyright © 2011-2022 走看看