1 条题解

  • 0
    @ 2026-2-5 0:48:22
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define psb push_back
    #define pii pair<int,int>
    #define x first
    #define y second
    const int N=5e5+1,M=1e6+1,p=998244353;
    int n,m,q,x,y,z,cnt,t,t2,tot,st[N],dfn[N],low[N],d[M],anc[N][19],f[M];
    struct A{ll x,y;}ans,s[N][19];
    A operator+(A a,A b){
    	return {(a.x*b.y+a.y*b.x)%p,a.y*b.y%p};
    }
    map<pii,int>mp;
    pii st2[M];
    vector<A>e[N];
    vector<int>e2[M];
    struct dcc{
    	int idd,s,t,cnt;ll sum;
    	unordered_map<int,ll>ds,dt,id;
    	unordered_map<int,vector<A>>e;
    	void add(int x,int y){
    		int z=mp[{x,y}];
    		sum+=z;
    		e[x].psb({y,z}),e[y].psb({x,z});
    	}
    	void init(){
    		int mx=0;
    		for(int i:e2[idd])
    			if(e[i].size()>mx) s=i,mx=e[i].size();
    			else if(e[i].size()==mx) t=i;
    		for(A i:e[s]){
    			int p=i.x,fa=s;
    			ds[s]=0,ds[p]=i.y,++cnt;
    			while(p!=t){
    				id[p]=cnt;
    				for(A j:e[p]) if(j.x!=fa){
    					fa=p,ds[j.x]=ds[p]+j.y,p=j.x;
    					break;
    				}
    			}
    		}
    		for(A i:e[t]){
    			int p=i.x,fa=t;
    			dt[t]=0,dt[p]=i.y;
    			while(p!=s) for(A j:e[p]) if(j.x!=fa){
    				fa=p,dt[j.x]=dt[p]+j.y,p=j.x;
    				break;
    			}
    		}
    		ds[t]=1e15;
    	}
    	A dis(int x,int y){
    		if(ds[x]>ds[y]) swap(x,y);
    		if(x==s||y==t||id[x]==id[y]) return {((ds[x]+dt[y])%p*(cnt-2)+sum)%p,cnt};
    		return {((ds[x]+dt[x]+ds[y]+dt[y])%p*(cnt-3)+2*sum)%p,2*cnt-2};
    	}
    }a[M];
    void add(int x,int y){
    	e2[x].psb(y),e2[y].psb(x);
    }
    void trj(int u,int fa){
    	dfn[u]=low[u]=++tot,st[++t]=u,d[u]=d[fa]+1;
    	for(A i:e[u]){
    		int v=i.x;
    		if(d[v]<d[u]&&v!=fa) st2[++t2]={u,v};
    		if(!dfn[v]){
    			trj(v,u);
    			if(low[v]>=dfn[u]){
    				++cnt,a[cnt].idd=cnt;
    				while(st[t]!=v) add(cnt,st[t--]);
    				add(cnt,st[t--]),add(cnt,u);
    				while(st2[t2]!=pii{u,v}) a[cnt].add(st2[t2].x,st2[t2].y),--t2;
    				a[cnt].add(st2[t2].x,st2[t2].y),--t2;
    			}
    			low[u]=min(low[u],low[v]);
    		}
    		else if(v!=fa) low[u]=min(low[u],dfn[v]);
    	}
    }
    void dfs(int u,int fa){
    	d[u]=d[fa]+1,f[u]=fa;
    	if(1<u&&u<=n){
    		s[u][0]=a[fa].dis(u,anc[u][0]=f[fa]);
    		for(int i=1;i<19;++i) anc[u][i]=anc[anc[u][i-1]][i-1],s[u][i]=s[u][i-1]+s[anc[u][i-1]][i-1];
    	}
    	for(int v:e2[u])
    		if(v!=fa) dfs(v,u);
    }
    signed main(){
    	ios::sync_with_stdio(0); cin.tie(0),cout.tie(0);
    	cin>>n>>m>>q; cnt=n;
    	for(int i=1;i<=m;++i) cin>>x>>y>>z,e[x].psb({y,z}),e[y].psb({x,z}),mp[{x,y}]=mp[{y,x}]=z;
    	trj(1,0);
    	for(int i=n+1;i<=cnt;++i) a[i].init();
    	dfs(1,0);
    	while(q--){
    		cin>>x>>y; ans={0,1};
    		if(d[x]<d[y]) swap(x,y);
    		for(int i=18;~i;--i)
    			if(d[x]-(1<<i+1)>=d[y]) ans=ans+s[x][i],x=anc[x][i];
    		if(x!=y){
    			for(int i=18;~i;--i)
    				if(anc[x][i]!=anc[y][i]) ans=ans+s[x][i]+s[y][i],x=anc[x][i],y=anc[y][i];
    			if(f[x]==f[y]) ans=ans+a[f[x]].dis(x,y);
    			else ans=ans+s[x][0]+s[y][0];
    		}
    		cout<<ans.x<<'\n';
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    7239
    时间
    6000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者