自闭题求调
查看原帖
自闭题求调
471571
封禁用户楼主2024/2/29 20:11

第三个点错了

#include<bits/stdc++.h>
#define M 200001
#define inf 1e16
#define ll long long
using namespace std;
inline ll read()
{
	ll k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
ll n,m,Q,cnt,h[M];
ll fa[M][21],dep[M],dis[M];/*最小生成树*/
ll f[M],vis[M];/*并查集*/
ll Dis[45][M],idx[M],flag[M],num;/*最短路径*/
struct edge
{
	ll to,ne,val;
	ll a,b,c,d;
}e[M<<1]/*树边*/,g[M<<1]/*求最小生成树*/;
struct node
{
	ll idx,val;
};
inline bool operator <(const node &x,const node &y)
{
	return x.val>y.val;
}
vector<node> q_edge[M];/*存原图边,用于最短路*/
inline void add(ll u,ll v,ll val)
{
	cnt++;
	e[cnt].to=v,e[cnt].ne=h[u],e[cnt].val=val,h[u]=cnt;
}
inline bool cmp(edge x,edge y)
{
	return x.c<y.c;
}
inline ll find(ll x)
{
	if(x!=f[x]) f[x]=find(f[x]);
	return f[x];
}
inline void kruskal()
{
	sort(g+1,g+m+1,cmp);
	for(ll i=1;i<=n;i++) f[i]=i;
	ll sum=0;
	for(ll i=1;i<=m;i++)
	{
		ll fx=find(g[i].a),fy=find(g[i].b);
		if(fx!=fy)
		{
			f[fx]=fy,sum++,vis[g[i].d]=1,add(g[i].a,g[i].b,g[i].c),add(g[i].b,g[i].a,g[i].c);
			if(sum==n-1) return;
		}
	}
}
inline void dfs(ll x,ll father,ll j)
{
	fa[x][0]=father,dep[x]=dep[father]+1,dis[x]=dis[father]+e[j].val;
	for(ll i=h[x];i;i=e[i].ne)
	{
		ll y=e[i].to;
		if(y!=fa[x][0]) dfs(y,x,i);
	}
}
inline void dijkstra(ll s)
{
	priority_queue<node> q;
	for(ll i=1;i<=n;i++) Dis[num][i]=inf,flag[i]=0;
	Dis[num][s]=0,q.push({s,Dis[num][s]});
	while(!q.empty())
	{
		node t=q.top();
		q.pop();
		if(flag[t.idx]) continue;
		flag[t.idx]=1;
		for(ll i=0;i<q_edge[t.idx].size();i++)
		{
			ll y=q_edge[t.idx][i].idx;
			if(Dis[num][y]>Dis[num][t.idx]+q_edge[t.idx][i].val) Dis[num][y]=Dis[num][t.idx]+q_edge[t.idx][i].val,q.push({y,Dis[num][y]});
		}
	}
}
inline void pre()
{
	for(ll j=1;j<=20;j++)
		for(ll i=1;i<=n;i++) fa[i][j]=fa[fa[i][j-1]][j-1];
	for(ll i=1;i<=m;i++)
		if(!vis[i])
		{
			if(!idx[g[i].a]) num++,idx[g[i].a]=num,dijkstra(g[i].a);
			if(!idx[g[i].b]) num++,idx[g[i].b]=num,dijkstra(g[i].b);
		}
}
inline ll LCA(ll x,ll y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(ll i=20;i>=0;i--)
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	if(x==y) return x;
	for(ll i=20;i>=0;i--)
		if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int main()
{
	n=read(),m=read();
	for(ll i=1;i<=m;i++) g[i].a=read(),g[i].b=read(),g[i].c=read(),g[i].d=i,q_edge[g[i].a].push_back({g[i].b,g[i].c}),q_edge[g[i].b].push_back({g[i].a,g[i].c});
	kruskal(),dfs(1,0,0),pre(),Q=read();
	while(Q--)
	{
		ll x=read(),y=read(),lca=LCA(x,y),ans=dis[x]+dis[y]-2*dis[lca];
		for(ll i=1;i<=num;i++) ans=min(ans,Dis[i][x]+Dis[i][y]);
		printf("%lld\n",ans);
	}
	return 0;
}```
2024/2/29 20:11
加载中...