求调,悬关
  • 板块灌水区
  • 楼主hwc2011
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/27 09:45
  • 上次更新2024/11/27 10:37:24
查看原帖
求调,悬关
1313003
hwc2011楼主2024/11/27 09:45

完整代码:

#include<bits/stdc++.h>
#define int long long
#define PII pair<int,int>
#define mp make_pair
#define fst first
#define snd second
#define pb push_back
#define inf 1e18
using namespace std;
const int N=1e5+50;
int n,m,vis1[N],vis2[N],dep[N],dis[50][N],dist[N],book[N],f[N][20],cnt,node[100],Q;
vector<PII>e[N],tree[N]; 
PII edge[N];
map<PII,int>p;
queue<int>q;
priority_queue<PII,vector< PII >,greater< PII > >qq;
inline void Dij(int id,int xx){
	for(int i=1;i<=n;i++){
		dis[id][i]=inf;
		book[i]=0;
	}
	qq.push(mp(0,xx));
	dis[id][xx]=0;
	while(!qq.empty()){
		int x=qq.top().snd;
		qq.pop();
		if(book[x]) continue;
		book[x]=1;
		for(auto i:e[x]){
			if(dis[id][x]+i.snd<dis[id][i.fst]){
				dis[id][i.fst]=dis[id][x]+i.snd;
				qq.push(mp(dis[id][i.fst],i.fst));
			}
		}
	}
}
inline void doLCA(int root){
	int t=(int)log2(n)+1;
	q.push(root);
	dep[root]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(auto i:tree[x]){
			int to=i.fst,we=i.snd;
			dep[to]=dep[x]+1;
			dist[to]=dist[x]+we;
			f[to][0]=x;
			for(int j=1;j<=t;j++) f[to][j]=f[f[to][j-1]][j-1];
		}
	}
}
inline int getLCA(int x,int y){
	int t=(int)log2(n)+1;
	if(dep[x]>dep[y]) swap(x,y);
	for(int i=t;i>=0;i--) if(dep[f[y][i]]>=dep[x]) y=f[y][i];
	if(x==y) return x;
	for(int i=t;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
inline int distLCA(int x,int y){
	return dist[x]+dist[y]-2*dist[getLCA(x,y)];
}
signed main(){
	freopen("shortway.in","r",stdin);
	freopen("shortway.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1,u,v,w;i<=m;i++){
		scanf("%lld%lld%lld",&u,&v,&w);
		e[u].pb(mp(v,w));
		e[v].pb(mp(u,w));
		edge[i]=mp(u,v);
		p[mp(u,v)]=p[mp(u,v)]=i;
	}
	q.push(1);
	vis1[1]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(auto i:e[x]){
			if(!vis1[i.fst]){
				tree[x].push_back(mp(i.fst,i.snd));
				vis2[p[mp(x,i.fst)]]=1;
				vis1[i.fst]=1;
				q.push(i.fst);
			}
		}
	}
	doLCA(1); 
	for(int i=1;i<=m;i++){
		if(!vis2[i]){
			node[++cnt]=edge[i].fst;
			node[++cnt]=edge[i].snd;
		}
	}
	for(int i=1;i<=cnt;i++) Dij(i,node[i]);
	scanf("%lld",&Q);
	while(Q--){
		int x,y;
		scanf("%lld%lld",&x,&y);
		int minn=distLCA(x,y);
		for(int i=1;i<=cnt;i++) minn=min(minn,dis[i][x]+dis[i][y]);
		printf("%lld\n",minn);
	}
} 

可能是什么原因?

2024/11/27 09:45
加载中...