• Gym102012A Rikka with Minimum Spanning Trees


    题意

    (T) 组数据,每组数据给定一个 (n) 个点,(m) 条边,可能含有重边自环的图,求出最小生成树的个数与边权和的乘积,对 (10^9+7) 取模。

    ( exttt{Data Range:}Tleq 100,2leq nleq 10^5,m=10^5)

    题解

    大家好,这题充分展现了我就是个 sb。

    一见数据随机,立刻想到相同边权的边很少,立刻想到矩阵大小很小,立刻想到最小生成树计数,立刻想到 Matrix-Tree 定理。某些 Karry5307 的想像惟在这一层能够如此跃进。

    直接进入正题,首先不能被题目中给出的最小生成树计数方法给带偏。

    注意到边权在 (0sim 2^{64}-1) 范围内随机给定,所以我们有很大的把握认定最小生成树唯一,求出这个生成树的边权和即可。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef int ll;
    typedef long long int li;
    typedef unsigned long long int ull;
    const ll MAXN=2e5+51,MOD=1e9+7; 
    struct EdgeForKruskal{
        ll from,to;
        ull dist;
        inline bool operator <(const EdgeForKruskal &rhs)const
        {
            return this->dist<rhs.dist;
        }
    };
    EdgeForKruskal ed[MAXN];
    ll test,n,m,x,y;
    ull z;
    ll ffa[MAXN];
    inline ll read()
    {
        register ll num=0,neg=1;
        register char ch=getchar();
        while(!isdigit(ch)&&ch!='-')
        {
            ch=getchar();
        }
        if(ch=='-')
        {
            neg=-1;
            ch=getchar();
        }
        while(isdigit(ch))
        {
            num=(num<<3)+(num<<1)+(ch-'0');
            ch=getchar();
        }
        return num*neg;
    }
    inline ll find(ll x)
    {
        return x==ffa[x]?x:ffa[x]=find(ffa[x]);
    }
    inline void merge(ll x,ll y)
    {
        ll fx=find(x),fy=find(y);
        fx!=fy?ffa[fy]=fx:1;
    }
    inline ll Kruskal()
    {
        ll tott=0,res=0;
        for(register int i=1;i<=m;i++)
        {
            if(find(ed[i].from)!=find(ed[i].to))
            {
                merge(ed[i].from,ed[i].to),res=(res+ed[i].dist%MOD)%MOD;
                if(++tott==n-1)
                {
                    break;
                }
            }
        }
        return tott==n-1?res:0;
    }
    namespace Maker{
        ull k1,k2;
        inline ull gen()
        {
            ull k3=k1,k4=k2;
            k1=k4,k3^=k3<<23,k2=k3^k4^(k3>>17)^(k4>>26);
            return k2+k4;
        }
    }
    using namespace Maker;
    inline void solve()
    {
        n=read(),m=read(),scanf("%llu%llu",&k1,&k2);
        for(register int i=1;i<=n;i++)
        {
            ffa[i]=i;
        }
        for(register int i=1;i<=m;i++)
        {
            x=gen()%n+1,y=gen()%n+1,z=gen(),ed[i]=(EdgeForKruskal){x,y,z};    
        }
        sort(ed+1,ed+m+1),printf("%d
    ",Kruskal());
    }
    int main()
    {
        test=read();
        for(register int i=0;i<test;i++)
        {
            solve();
        }
    }
    
  • 相关阅读:
    BI的相关技术和产品细分(转自娄工)
    SOA系列二:采用SOA的常见失误
    ASP.NET第三方控件网站
    BI名词字典
    VSS2005 添加文件夹方法!
    c#范型编程系列一(非原创)
    数据挖掘项目的生命周期
    SQLServer 2005开发与商业智能培训大纲
    CVSNT配置配置与在ECLIPSE中使用
    JS通用UI框架
  • 原文地址:https://www.cnblogs.com/Karry5307/p/13617252.html
Copyright © 2020-2023  润新知