Kruscal重构树10pts求调
查看原帖
Kruscal重构树10pts求调
511271
ダ月Nahida楼主2023/1/18 23:25

RT。

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
const int M=4e5+10;
struct node1{int x,y,z;}E[M];
struct node2{int x,dis;};
struct node3{int y,z;};
bool cmp(const node1 &x,const node1 &y){return x.z>y.z;}
bool operator <(const node2 &x,const node2 &y){return x.dis>y.dis;}
int T,n,m;
vector<node3> a[N];
vector<int> b[N];
int fd[N],val[N],cnt;
int dis[N];
bool vis[N];
priority_queue<node2> q;
int find(int x){return fd[x]==x?x:fd[x]=find(fd[x]);}
void Kruscal(){
	sort(E+1,E+m+1,cmp);cnt=n;
	for(int i=1;i<=2*n;i++) fd[i]=i;
	for(int i=1;i<=m;i++){
		int fx=find(E[i].x),fy=find(E[i].y);
		if(fx==fy) continue;
		val[++cnt]=E[i].z;fd[fx]=cnt,fd[fy]=cnt;
		b[cnt].push_back(fx);
		b[cnt].push_back(fy);
		if(cnt==2*n-1) break;
	}
}
void Dijkstra(){
	memset(dis,63,sizeof(dis));
	memset(vis,false,sizeof(vis));
	while(!q.empty()) q.pop();
	dis[1]=0;q.push({1,0});
	while(!q.empty()){
		int x=q.top().x;q.pop();
		if(vis[x])continue;vis[x]=true;
		for(int i=0;i<a[x].size();i++){
			int y=a[x][i].y,z=a[x][i].z;
			if(dis[x]+z<dis[y]){
				dis[y]=dis[x]+z;
				q.push({y,dis[y]});
			}
		}
	}
}
namespace Latest_Ancestor{
	int f[N][30];
	int Vl[N];
	void dfs(int x,int F){
		bool flag=false;
		f[x][0]=F;
		for(int i=0;i<b[x].size();i++){
			int y=b[x][i];
			if(y!=F) dfs(y,x),flag=true,Vl[x]=min(Vl[x],Vl[y]);
		}if(!flag) Vl[x]=dis[x];
	}
	void init(){
		for(int j=1;j<=20;j++)
			for(int i=1;i<=n;i++)
				f[i][j]=f[f[i][j-1]][j-1];
	}
	int LCA(int x,int p){
		for(int i=20;i>=0;i--)
			if(val[f[x][i]]>p) x=f[x][i];
		return x;
	}
}
int main(){
	freopen("return3.in","r",stdin);
	freopen("out.ans","w",stdout);
	using namespace Latest_Ancestor;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++){
			int x,y,z,l;
			scanf("%d%d%d%d",&x,&y,&z,&l);
			E[i]={x,y,l};
			a[x].push_back({y,z});
			a[y].push_back({x,z});
		}Kruscal();Dijkstra();
		memset(Vl,63,sizeof(Vl));
		dfs(cnt,0);init();
		int q,k,s;scanf("%d%d%d",&q,&k,&s);
		int ans=0;
		while(q--){
			int x,y;scanf("%d%d",&x,&y);
			x=(x+k*ans-1)%n+1,y=(y+k*ans)%(s+1);
			int pos=LCA(x,y);ans=Vl[pos];
			printf("%d\n",ans);
		}
		for(int i=1;i<=2*n;i++)
			while(!a[i].empty())
				a[i].pop_back();
		for(int i=1;i<=2*n;i++)
			while(!b[i].empty())
				b[i].pop_back();
	}
}

似乎答案中的零,这个程序都会输出一些非零数。

2023/1/18 23:25
加载中...