求调,全WA
查看原帖
求调,全WA
285617
黑影洞人楼主2023/11/26 15:27
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
#define N 16145141
#define M 55141
using namespace std;
int n,m,s,ask;
vector<int>g[M];
int head[N],to[N],nxt[N],val[N],tot; 
int f[M][20],dep[M],cnt;
int in[M][20],out[M][20];
int fa[M];
bool vis[N];
int dis[N];
struct node{int x,y,xx,yy,w;}a[M*20];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void add(int u,int v,int w){
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
	val[tot]=w;
}
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;
	f[x][0]=fa;
	in[x][0]=++cnt;
	add(in[x][0],x,0);add(in[x][0],fa,0);
	out[x][0]=++cnt;
	add(x,out[x][0],0);add(fa,out[x][0],0);
	for(int i=1;i<20;i++){
		f[x][i]=f[f[x][i-1]][i-1];
		in[x][i]=++cnt;
		add(in[x][i],in[x][i-1],0);add(in[x][i],in[f[x][i-1]][i-1],0);
		out[x][i]=++cnt;
		add(out[x][i-1],out[x][i],0);add(out[f[x][i-1]][i-1],out[x][i],0);
	}
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i];
		if(y==fa)continue;
		dfs(y,x);
	}
}
void link(int x,int y,int xx,int yy,int w){
	int inn=++cnt,outn=++cnt;
	if(dep[x]<dep[y])swap(x,y);
	add(y,outn,0);
	for(int i=19;i>=0;i--){
		if(dep[f[x][i]]>=dep[y]){
			add(out[x][i],outn,0);
			x=f[x][i];
		}
	}
	if(x!=y){
		for(int i=19;i>=0;i--){
			if(f[x][i]==f[y][i]){
				add(out[x][i],outn,0);
				x=f[x][i];
				add(out[y][i],outn,0);
				y=f[y][i];
			}
		}
		add(out[x][0],outn,0);
	}
	if(dep[xx]<dep[yy])swap(xx,yy);
	add(inn,y,0);
	for(int i=19;i>=0;i--){
		if(dep[f[xx][i]]>=dep[yy]){
			add(inn,in[xx][i],0);
			xx=f[xx][i];
		}
	}
	if(xx!=yy){
		for(int i=19;i>=0;i--){
			if(f[xx][i]==f[yy][i]){
				add(inn,in[xx][i],0);
				xx=f[xx][i];
				add(inn,in[yy][i],0);
				yy=f[yy][i];
			}
		}
		add(inn,in[xx][0],0);
	}
	add(outn,inn,w);
}
void dijkstra(int s){
	priority_queue<pair<int,int> >q;
	memset(dis,0x3f,sizeof(dis));
	q.push(make_pair(0,s));
	dis[s]=0;
	while(!q.empty()){
		int x=q.top().second;q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=head[x];i;i=nxt[i]){
			int y=to[i],w=val[i];
			if(dis[y]>dis[x]+w){
				dis[y]=dis[x]+w;
				q.push(make_pair(-dis[y],y));
			}
		}
	}
}
signed main(){
	scanf("%d%d%d",&n,&m,&s);
	cnt=n;
	for(int i=1;i<=n;i++)fa[i]=i;
	while(m--){
		int op,x,y,xx,yy,w;
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d%d%d",&x,&y,&xx,&yy,&w);
			if(find(x)!=find(y))continue;
			if(find(xx)!=find(yy))continue;
			a[++ask]=(node){x,y,xx,yy,w};
		}else{
			scanf("%d%d%d",&x,&y,&w);
			xx=find(x);
			yy=find(y);
			if(xx==yy)continue; 
			g[x].push_back(y);
			g[y].push_back(x);
			add(x,y,w);
			add(y,x,w);
			fa[xx]=yy;
		}
	}
	for(int i=1;i<=n;i++)if(!dep[i])dfs(i,0);
	for(int i=1;i<=ask;i++)link(a[i].x,a[i].y,a[i].xx,a[i].yy,a[i].w);
	dijkstra(s);
	for(int i=1;i<=n;i++)printf("%d ",dis[i]==0x3f3f3f3f?-1:dis[i]);
	puts("");
	return 0;
}



2023/11/26 15:27
加载中...