Kruskal重构书WA求助,不能过样例4、5,时间复杂度没有问题
查看原帖
Kruskal重构书WA求助,不能过样例4、5,时间复杂度没有问题
593595
_Aurore_楼主2022/10/24 15:03
#include<bits/stdc++.h>
#define int long long 
#define MAXM 400001
#define MAXN 200001
#define INF 1000000000000000000
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
} 
int n,m,cnt,lastans,dis[MAXN],dep[MAXN+MAXM];
int val[MAXN+MAXM],mn[MAXN+MAXM];
int dad[MAXN+MAXM][2],fa[MAXN+MAXM][25];
bool vis[MAXN];
struct path{
	int u,v,len,hig;
}p[MAXM*2];
struct node{
	int x,dis;
};
struct cmp{
	bool operator()(node a,node b){
		return a.dis>b.dis;
	}
};
bool cmp1(path a,path b){
	return a.len>b.len;
}
vector<path> e[MAXN];
vector<int> t[MAXN+MAXM];
priority_queue<node,vector<node>,cmp> q;
void Dijkstra(){
	memset(vis,0,sizeof(vis));
	for(int i=0;i<=n;i++)
	    dis[i]=INF;
	dis[1]=0;
	q.push((node){1,0});
	while(!q.empty()){
		int x=q.top().x;
		q.pop();
		if(vis[x])
		    continue;
		vis[x]=1;
		for(int i=0;i<e[x].size();i++)
		    if(dis[e[x][i].v]>dis[x]+e[x][i].len){
		    	dis[e[x][i].v]=dis[x]+e[x][i].len;
		        q.push((node){e[x][i].v,dis[e[x][i].v]});
			}
	}
}
int find(int x,int opt){
	if(dad[x][opt]==x) return x;
    return dad[x][opt]=find(dad[x][opt],opt);
}
void dfs(int x,int fat,int d){
	dep[x]=d;
	fa[x][0]=fat;
	for(int i=1;i<=24;i++)
	    fa[x][i]=fa[fa[x][i-1]][i-1];
	if(x>n)
	    mn[x]=INF;
	for(int i=0;i<t[x].size();i++)
	    if(t[x][i]!=fat){
	    	dfs(t[x][i],x,d+1);
	    	mn[x]=min(mn[x],mn[t[x][i]]);
		}     
}
signed main(){
	int T=read();
	while(T--){
		n=cnt=read(),m=read();
		lastans=0;
		memset(p,0,sizeof(p));
		memset(e,0,sizeof(e));
		memset(t,0,sizeof(t));
		memset(val,0,sizeof(val));
		memset(mn,0,sizeof(mn));
		memset(dep,0,sizeof(dep));
		memset(fa,0,sizeof(fa)); 
		memset(dad,0,sizeof(dad));
		for(int i=1;i<=m;i++){
			int u=read(),v=read(),l=read(),a=read();
			p[i].u=u,p[i].v=v,p[i].len=l,p[i].hig=a;
			p[i+m].u=v,p[i+m].v=u,p[i+m].len=l,p[i+m].hig=a;
			e[u].push_back((path){u,v,l,a});
			e[v].push_back((path){v,u,l,a});
		}
		Dijkstra();
	    for(int i=0;i<=n+m;i++)
	        dad[i][0]=dad[i][1]=i;
	    sort(p+1,p+m*2+1,cmp1);
	    int sum=0;
	    for(int i=1;i<=m*2;i++){
	    	int u=p[i].u,v=p[i].v;
	    	int dx=find(u,0),dy=find(v,0);
	    	if(dx==dy)
	    	    continue;
	    	sum++;
	    	int fx=find(u,1),fy=find(v,1);
	    	dad[dx][0]=dy;
	    	dad[fx][1]=dad[fy][1]=++cnt;
	    	t[cnt].push_back(fx),t[cnt].push_back(fy);
			t[fx].push_back(cnt),t[fy].push_back(cnt); 
			val[cnt]=p[i].hig;
			if(sum==n-1)
			    break;
		}
		for(int i=1;i<=n;i++)
		    mn[i]=dis[i];
		dfs(cnt,0,1);
		int q=read(),k=read(),s=read();
		while(q--){
			int v=read(),p=read();
			v=(v+k*lastans-1)%n+1;
			p=(p+k*lastans)%(s+1);
			for(int i=24;i>=0;i--)
			    if((dep[v]-(1<<i))>0&&val[fa[v][i]]>p)
			        v=fa[v][i];
			lastans=mn[v];
			cout<<lastans<<endl;
		}
	}
	return 0;
}
2022/10/24 15:03
加载中...