1 条题解

  • 0
    @ 2025-10-8 16:52:00
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e5+10,M=N<<1,mod=1e9+7;
    struct Edge{int x,y,w;}E[M];
    vector<int>G[N<<1];
    int n,m,nn,fa[N<<1],dfn[N<<1],path[N<<2],id=0;
    int val[N<<1],f[N<<2][20],logn[N<<2];
    int findfa(int x){return x==fa[x] ? x : fa[x]=findfa(fa[x]);}
    void ex_kruskal()
    {
    	nn=n;
    	sort(E+1,E+m+1,[&](Edge e1,Edge e2){return e1.w<e2.w;});
    	for(int i=1;i<2*n;i++)fa[i]=i;
    	for(int i=1;i<=m;i++)
    	{
    		int tx=findfa(E[i].x),ty=findfa(E[i].y);
    		if(tx!=ty)
    		{
    			++nn;
    			val[nn]=E[i].w;
    			fa[tx]=fa[ty]=nn;
    			G[nn].emplace_back(tx),G[nn].emplace_back(ty);
    			if(nn==2*n-1)break;
    		}
    	}
    }
    void dfs(int x)
    {
    	dfn[x]=++id;
    	path[id]=x;
    	for(int y:G[x])
    		dfs(y),
    		path[++id]=x;
    }
    int lca(int x,int y)
    {
    	x=dfn[x],y=dfn[y];
    	if(x>y)swap(x,y);
    	int k=logn[y-x+1];
    	x=f[x][k],y=f[y-(1<<k)+1][k];
    	return dfn[x]<dfn[y] ? x : y;
    }
    int A,B,C,P;
    inline int rnd(){return A=(A*B+C)%P;}
    signed main()
    {
    	ios::sync_with_stdio(False);cin.tie(0);cout.tie(0);
    	cin>>n>>m;
    	for(int i=1;i<=m;i++)cin>>E[i].x>>E[i].y>>E[i].w;
    	ex_kruskal();
    	dfs(nn);
    	logn[1]=0;for(int i=2;i<=4*n;i++)logn[i]=logn[i>>1]+1;
    	for(int i=1;i<=4*n;i++)f[i][0]=path[i];
    	int D=log2(4*n);
    	for(int j=1;j<=D;j++)
    		for(int i=1;i+(1<<j)-1<=4*n;i++)
    		{
    			int x=f[i][j-1],y=f[i+(1<<(j-1))][j-1];
    			f[i][j]=dfn[x]<dfn[y] ? x : y;
    		}
    		
    	int q;cin>>q>>A>>B>>C>>P;
    	long long ans=0;
    	while(q--)
    	{
    		int x=rnd()%n+1,y=rnd()%n+1;
    		if(x==y)continue;
    		ans=(ans+val[lca(x,y)])%mod;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1

    *【Kruskal 重构树】[LOJ137]最小瓶颈路(加强版)

    信息

    ID
    536
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    75
    已通过
    15
    上传者