求助,WA#3
查看原帖
求助,WA#3
632131
Kevin911楼主2023/11/27 21:46
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
const int maxn=1e5+10;
bool vis[maxn];
int n,m,k;
struct node
{
	int x,y,z;
}e[maxn];
int fat[maxn];
int get(int x)
{
	if(x==fat[x]) return x;
	return fat[x]=get(fat[x]);
}
int d[maxn],d_42[43][maxn],p[maxn];
vector<pii> gr[maxn];
void dij(int x)
{
	priority_queue<pii,vector<pii>,greater<pii>> q;
	for(int i=1;i<=n;i++) vis[i]=0;
	d_42[x][p[x]]=0;
	q.push({0,p[x]});
	while(!q.empty())
	{
		int u=q.top().second;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=0;i<gr[u].size();i++)
		{
			int v=gr[u][i].first,w=gr[u][i].second;
			if(d_42[x][v]>d_42[x][u]+w)
			{
				d_42[x][v]=d_42[x][u]+w;
				q.push({d_42[x][v],v});
			}
		}
	}
}
int g[maxn],cnt;
int fa[maxn][21];
void dfs(int u,int f)
{
	for(int i=0;i<gr[u].size();i++)
	{
		int v=gr[u][i].first,w=gr[u][i].second;
		if(v==f) continue;
		fa[v][0]=u;
		d[v]=d[u]+w;
		dfs(v,u);
	}
}
int lca(int x,int y)
{
	if(d[x]<d[y]) swap(x,y);
	for(int i=20;i>=0;i--)
		if(d[fa[x][i]]>=d[y]) x=fa[x][i];
	if(x==y) return x;
	for(int i=20;i>=0;i--)
		if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++) cin>>e[i].x>>e[i].y>>e[i].z;
	for(int i=1;i<=n;i++) fat[i]=i;
	for(int i=1;i<=m;i++)
	{
		int fx=get(e[i].x),fy=get(e[i].y);
		if(fx==fy)
		{
			g[i]=1;
			p[++cnt]=e[i].x;
			p[++cnt]=e[i].y;
			continue;
		}
		fat[fx]=fy;
	}
	for(int i=1;i<=m;i++)
		if(!g[i])
		{
			gr[e[i].x].push_back({e[i].y,e[i].z});
			gr[e[i].y].push_back({e[i].x,e[i].z});
		}
	dfs(1,0);
	for(int i=1;i<=20;i++)
		for(int j=1;j<=n;j++)
			fa[j][i]=fa[fa[j][i-1]][i-1];
	for(int i=1;i<=m;i++)
		if(g[i])
		{
			gr[e[i].x].push_back({e[i].y,e[i].z});
			gr[e[i].y].push_back({e[i].x,e[i].z});
		}
	for(int i=1;i<=cnt;i++)
	{
		for(int j=1;j<=n;j++) d_42[i][j]=1e15;
		d_42[i][p[i]]=0;
		dij(i);
	}
	int q;
	cin>>q;
	for(int i=1;i<=q;i++)
	{
		int x,y;
		cin>>x>>y;
		int ans=d[x]+d[y]-2*d[lca(x,y)];
		for(int j=1;j<=cnt;j++) ans=min(ans,d_42[j][x]+d_42[j][y]);
		cout<<ans<<endl;
	}
}
2023/11/27 21:46
加载中...