1 条题解
-
0
#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
- 上传者