归程T飞了(马蜂良好)
查看原帖
归程T飞了(马蜂良好)
556740
hzx360楼主2024/2/23 20:37

用 Kruskal 重构树 写的

#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=5e5+100;long long inf=10e9;
int P[23];
int n,m,fa[N],val[N],nod;long long mi[N]; 
int de[N],anc[N][21];
struct edge{int x,y,z;}e[N];
bool cmp(edge A,edge B){return A.z>B.z;}
int head[N],to[N],ne[N],tot;
void add(int x,int y){
	ne[++tot]=head[x];
	to[tot]=y;
	head[x]=tot;
	return;
}
struct Dij{
	bool vis[N]; long long dis[N];
	struct node{
		long long id,dis;
		bool operator <(node it) const{return dis>it.dis;}
	};priority_queue<node>q;
	int head[N],to[N],w[N],ne[N],tot;
	void deal(){
		for(re int i=1;i<=n;i++) head[i]=0,vis[i]=0;
		tot=0;
		return;
	}
	void add(int x,int y,int z){
		ne[++tot]=head[x];
		to[tot]=y,w[tot]=z;
		head[x]=tot;
		return;
	}
	void dij(){
		for(re int i=1;i<=n;i++) dis[i]=inf;
		dis[1]=0;
		q.push((node){1,dis[0]});
		while(!q.empty()){
			node u=q.top(); q.pop();
			if(vis[u.id]) continue;
			vis[u.id]=1;
			for(int i=head[u.id];i;i=ne[i]){
				int v=to[i];
				if(dis[v]>u.dis+w[i])
					dis[v]=u.dis+w[i],q.push((node){v,dis[v]});
			}
		}
		return;
	}
}D;
void pre_dfs(int u,int f){
//	cout<<u<<endl;
	if(u<=n) mi[u]=D.dis[u];
	else mi[u]=inf;
	de[u]=de[f]+1,anc[u][0]=f;
	for(re int i=1;i<=19;i++) anc[u][i]=anc[anc[u][i-1]][i-1];
	for(re int i=head[u];i;i=ne[i]){
		int v=to[i];
		pre_dfs(v,u);
		mi[u]=min(mi[u],mi[v]);
	}
	return;
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void krual_tree(){
	sort(e+1,e+1+m,cmp);
	for(re int i=1;i<=m;i++){
		int x=e[i].x,y=e[i].y,z=e[i].z;
		int fx=find(x),fy=find(y);
		if(fx==fy) continue;
		nod++,val[nod]=z;
		fa[fx]=fa[fy]=nod;
		add(nod,fx),add(nod,fy);
	}
	return;
}
int check(int x,int mid,int p){
	for(re int i=19;i>=0;i--){
		if(P[i]<=mid) mid-=P[i],x=anc[x][i];
		if(val[x]<p) return -1; 
	}
	return x;
}
void deal(){
	nod=0,tot=0;
	memset(fa,0,sizeof(fa));
	memset(head,0,sizeof(head));
	memset(val,0,sizeof(val));
	memset(anc,0,sizeof(anc));
	return;
}
int main(){
	P[0]=1;
	for(re int i=1;i<=19;i++) P[i]=P[i-1]*2;
	int T; cin>>T;
	while(T--){
		cin>>n>>m; nod=n;
		for(re int i=1;i<=2*n;i++) fa[i]=i;
		for(re int i=1;i<=m;i++){
			int u,v,l,a;
			scanf("%d%d%d%d",&u,&v,&l,&a);
			e[i]=(edge){u,v,a};
			D.add(u,v,l),D.add(v,u,l);
		}
		D.dij(),krual_tree(),pre_dfs(nod,0);
		int Q,K,S;
		cin>>Q>>K>>S;
		long long ans=0;
		for(re int i=1;i<=Q;i++){
			long long v0,p0;
			scanf("%lld%lld",&v0,&p0);
			v0=(v0+K*ans-1)%n+1,p0=(p0+K*ans)%(S+1);
			int v=v0,p=p0,lca=v;
			for(int i=19;i>=0;i--) if(P[i]<=de[lca]-1 and val[anc[lca][i]]>p) lca=anc[lca][i];
			ans=mi[lca];
			cout<<ans<<endl;
		}
		deal(),D.deal();
	}
}
2024/2/23 20:37
加载中...