关于SPFA
查看原帖
关于SPFA
716260
tianyu_awa楼主2024/11/20 15:54

它活了,而且一个优化也没加。
代码是朋友的。

#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
int head[N],vct[N],nxt[N],edge[N],idx;
void add(int x,int y,int w){
	vct[++idx]=y;edge[idx]=w;
	nxt[idx]=head[x];head[x]=idx;
}
int dis[N];
void dij(); 
struct node{
	int x,y,w,l;
	bool operator<(const node p)const{
		return w>p.w;
	} 
}S[N];
int n,m;
int fa[N];
void init(){
	for(int i=1;i<=2*n;i++)fa[i]=i;
} 
int find(int x){
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
int cnt,w[N];
void kruskal(){
	init();
	sort(S+1,S+1+m);
	cnt=n;
	for(int i=1;i<=m;i++){
		int x=find(S[i].x),y=find(S[i].y);
		if(x==y)continue;
		fa[x]=++cnt;fa[y]=cnt;
		add(cnt,x,0),add(cnt,y,0);
		w[cnt]=S[i].w;
	}	
}
void init_s(){
	idx=0;
	memset(head,0,sizeof head);
	memset(nxt,0,sizeof nxt);
}
int dep[N],fath[N][24];
void dfs(int u){
//	cout<<u<<'\n';
	for(int i=head[u];i;i=nxt[i]){
		int v=vct[i];
		dep[v]=dep[u]+1;fath[v][0]=u;
		dfs(v);
		dis[u]=min(dis[u],dis[v]);
	}
}
int lst;
void init_f(){
	for(int k=1;k<=20;k++){
		for(int i=1;i<=cnt;i++){
			fath[i][k]=fath[fath[i][k-1]][k-1];
		}
	}
}
//0 50 150 200 50 0 0
//0 0 0 0 2 1 1 
int query(int x,int ws){
	for(int i=20;i>=0;i--)if(w[fath[x][i]]>ws)x=fath[x][i];
	return x;
}
void solve(){
	cin>>n>>m;
	init_s();
	for(int i=1;i<=m;i++){
		cin>>S[i].x>>S[i].y>>S[i].l>>S[i].w;
		add(S[i].x,S[i].y,S[i].l);add(S[i].y,S[i].x,S[i].l);
	}
	dij();
	//UP good
	init_s();
	kruskal();
	dfs(cnt);
	init_f();
	int q,k,s;
	cin>>q>>k>>s;
	lst=0;
	for(int i=1;i<=q;i++){
		int u,v;
		cin>>u>>v;
		u=(u+k*lst-1)%n+1;
		v=(v+k*lst)%(s+1);
//		cout<<query(u,v)<<'\n';
		cout<<(lst=dis[query(u,v)])<<'\n';
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//	cout<<dis[-1];
	int T;
	cin>>T;
	while(T--)solve();
	return 0;
}
#define pi pair<int,int> 
void dij(){
	memset(dis,0x3f3f3f3f,sizeof dis);
	priority_queue<pi>q;
	q.push({0,1});dis[1]=0;
	while(q.size()){
		int u=q.top().second;q.pop();
		for(int i=head[u];i;i=nxt[i]){
			int v=vct[i];
			if(dis[v]>dis[u]+edge[i])dis[v]=dis[u]+edge[i],q.push({-dis[v],v});
		}
	}
}
2024/11/20 15:54
加载中...