萌新求助,调到自闭了
查看原帖
萌新求助,调到自闭了
226760
RedLycoris楼主2021/12/20 20:26

WA3

通读了半个小时也没有发现问题/ll

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
const int mxn=5e5+5;
ll dist[44][mxn];int imp[44],cc;
vector<pair<int,ll> >g[mxn],tg[mxn];//g是图边 tg是树边
int n,m;
int fa[mxn];
inline void init(){for(int i=1;i<=n;++i)fa[i]=i;}
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void bfs(int id){
	int bg=imp[id];
	priority_queue<pair<ll,int> >q;for(;q.size();)q.pop();
	q.push(mp(0,bg));
	dist[id][bg]=0;
	for(;q.size();){
		pair<ll,int>p=q.top();q.pop();
		int x=p.second;
		ll cur=-p.first;
		if(dist[id][x]<cur)continue;
		for(pair<int,ll> ee:g[x]){
			int y=ee.first;ll w=ee.second;
			if(dist[id][y]>cur+w){
				dist[id][y]=cur+w;
				q.push(mp(-dist[id][y],y));
			}
		}
	}
}
int dep[mxn],par[mxn][22];
ll sum[mxn];
inline void dfs(int x,int pa=1,int deep=1,ll sm=0){
	dep[x]=deep,par[x][0]=pa,sum[x]=sm;
	for(pair<int,ll> ee:tg[x]){
		int y=ee.first;ll w=ee.second;
		if(y!=pa)dfs(y,x,deep+1,sm+w);
	}
}
inline void prep(){for(int j=1;j<20;++j)for(int i=1;i<=n;++i)par[i][j]=par[par[i][j-1]][j-1];}
inline int lca(int x,int y){
	if(dep[x]>dep[y])swap(x,y);
	for(int i=19;~i;--i)if(dep[par[y][i]]>=dep[x])y=par[y][i];
	for(int i=19;~i;--i)if(par[x][i]!=par[y][i])x=par[x][i],y=par[y][i];
	for(;x!=y;)x=par[x][0],y=par[y][0];
	return x;
}
inline ll dis(int x,int y){
	int LCA=lca(x,y);
	return sum[x]+sum[y]-2*sum[LCA];
}
int added[mxn];
inline void solve(){
	cin>>n>>m;init();
	for(int i=1;i<=m;++i){
		int u,v,w;cin>>u>>v>>w;
		g[u].push_back(mp(v,w)),g[v].push_back(mp(u,w));
		if(find(u)==find(v)){
			if(!added[u])imp[++cc]=u;
			if(!added[v])imp[++cc]=v;
			added[u]=1;
			added[v]=1;
		}else fa[find(u)]=find(v),tg[u].push_back(mp(v,w)),tg[v].push_back(mp(u,w));
	}
//	for(int i=1;i<=cc;++i){
//		cerr<<imp[i]<<" : ";
//		for(int j=1;j<=n;++j)cerr<<dist[i][j]<<' ';cerr<<'\n';
//	}
	memset(dist,63,sizeof(dist));
	for(int i=1;i<=cc;++i)bfs(i);
	dfs(1);
	int q;cin>>q;
	for(;q--;){
		int u,v;cin>>u>>v;
		ll ans=dis(u,v);
//		cerr<<"?? "<<dis(u,v)<<'\n';
		for(int i=1;i<=cc;++i)ans=min(ans,dist[i][u]+dist[i][v]);
		cout<<ans<<'\n';
	}
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int T=1;
	//cin>>T;
	for(;T--;)solve();
	return 0;
}
2021/12/20 20:26
加载中...