zoukankan      html  css  js  c++  java
  • poj3723 Conscription

    /*
       并查集的应用
       
       再次提醒,poj很喜欢很喜欢卡cin,千万记得,一卡TLE就换scanf!(而且有时是,不管cin有没有取消和stdio的同步,都会被卡...)
    */
    
    #include <iostream>
    #include <algorithm>
    #include <cstring> 
    #include <cstdio> 
    using namespace std;
    const int MAX_E = 50010;
    const int MAX_R = 50010;
    typedef long long ll;
    int V, E; // 顶点和边数
    int N, M, R;
    int X[MAX_R], Y[MAX_R], d[MAX_R];
    int f[MAX_E];
    struct edge
    {
    	int u, v, cost;
    	edge(int a = 0, int b = 0, int c = 0)
    	{
    		u = a; v = b; cost = c;
    	}
    };
    edge es[MAX_E];
    void init()
    {
    	for (int i = 0; i < V; i++) 
    	{
    		f[i] = i;
    	}
    }
    int find(int x)
    {
    	return (f[x] == x ? x : f[x] = find(f[x]));
    }
    bool comp( const edge&e1, const edge&e2 )
    {
    	return e1.cost < e2.cost;
    }
    
    void unite(int x, int y)
    {
    	x = find(x); y = find(y);
    	if (x == y) return;
    	f[y] = x;
    //	int u = find(x), v = find(y);
    //	if (u == v) return;
    //	f[v] = u;
    }
    
    bool same(int x, int y)
    {
    	return find(x) == find(y);
    }
    
    void solve()
    {
    	sort(es, es + E, comp);
    	init ();
    	int res = 0;
    	for (int i = 0; i < E; i++)
    	{
    		edge e = es[i];
    		if (!same(e.u, e.v))
    		{
    			unite(e.u, e.v);
    			res += e.cost;
    		}
    	}
    	res += 10000 * (N + M);
    	cout << res << endl;
    }
    int main()
    {
    	int k;
    	scanf("%d", &k);
    	while (k--)
    	{
    		scanf("%d%d%d", &N, &M, &R);
    		V = N + M;
    		E = R;
    		for (int i = 0; i < R; i++)
    		{
    			scanf("%d%d%d", X+i, Y+i, d+i);
    			es[i] = edge(X[i], N + Y[i], -d[i]);
    		}		
    		solve();
    	}
    	return 0;
    }

  • 相关阅读:
    游标+递归 查询 客户 子客户 查询财务信用
    导入EXCEL
    ftp读取txt数据并插入数据库
    查询通话时间报表
    4.10上午
    4.7下午
    4.6下午
    4.6上午
    4.5上午
    4.1下午
  • 原文地址:https://www.cnblogs.com/mofushaohua/p/7789487.html
Copyright © 2011-2022 走看看