求助,最后两个点 RE
查看原帖
求助,最后两个点 RE
518232
Sternenlicht楼主2023/5/3 21:26
#include <bits/stdc++.h>
namespace IO{
	#define LL long long
	inline LL read(){
		LL x=0,f=1;char c=getchar();
		for (;!isdigit(c);c=getchar())if (c=='-')f=-1;
		for (;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
		return x*f;
	}
	inline void write(LL x,char c='\n'){
		if (x){
			if (x<0)x=-x,putchar('-');
			char a[30];short l;
			for (l=0;x;x/=10)a[l++]=x%10^48;
			for (l--;l>=0;l--)putchar(a[l]);
		}else putchar('0');putchar(c);
	}
}using namespace IO;
using namespace std;

#define pii pair<int,int>
const int N = 6e4+10;
const int M = 2e6+10;
const int E = 5e6+10;
const int L = 2e7+10;
const int INF = 0x3f3f3f3f;
struct Tree{int to,nxt;}tr[N<<1];
struct Edge{int to,nxt,val;}ed[L];
struct Query{int x,y,a,b,val;}q[M];
int ht[N],tott,hd[E],tote,dis[E],fa[N],n,m,s,totq;
int dep[N],f[N][20],in[N][20],out[N][20],lnode,tim;
void addt(int x,int y){tr[++tott]={y,ht[x]};ht[x]=tott;}
void adde(int x,int y,int z){ed[++tote]={y,hd[x],z};hd[x]=tote;}
bool cmp(int x,int y){return dis[x]<dis[y];}
int Getfa(int x){return fa[x]==x?x:fa[x]=Getfa(fa[x]);}
void dfs(int x,int father){
	f[x][0]=father;
	dep[x]=dep[father]+1;
	in[x][0]=++tim;
	adde(tim,x,0);
	adde(tim,father,0);
	out[x][0]=++tim;
	adde(x,tim,0);
	adde(father,tim,0);
	for (int i=0;i<lnode;i++)
		f[x][i+1]=f[f[x][i]][i],
		in[x][i+1]=++tim,
		adde(tim,in[x][i],0),
		adde(tim,in[f[x][i]][i],0),
		out[x][i+1]=++tim,
		adde(out[x][i],tim,0),
		adde(out[f[x][i]][i],tim,0);
	for (int i=ht[x];i;i=tr[i].nxt){
		int y=tr[i].to;
		if (y==father)continue;
		dfs(y,x);
	}
}
void lca1(int x,int y,int k){
	if (dep[x]<dep[y])swap(x,y);
	adde(y,k,0);
	for (int i=lnode;i>=0;i--)
		if (dep[f[x][i]]>=dep[y])
			adde(out[x][i],k,0),x=f[x][i];
	if (x==y)return ;
	for (int i=lnode;i>=0;i--)
		if (f[x][i]!=f[y][i])
			adde(out[x][i],k,0),x=f[x][i],
			adde(out[y][i],k,0),y=f[y][i];
	adde(out[x][0],k,0);
}
void lca2(int x,int y,int k){
	if (dep[x]<dep[y])swap(x,y);
	adde(k,y,0);
	for (int i=lnode;i>=0;i--)
		if (dep[f[x][i]]>=dep[y])
			adde(k,in[x][i],0),x=f[x][i];
	if (x==y)return ;
	for (int i=lnode;i>=0;i--)
		if (f[x][i]!=f[y][i])
			adde(k,in[x][i],0),x=f[x][i],
			adde(k,in[y][i],0),y=f[y][i];
	adde(k,in[x][0],0);
}
void dijkstra(int s){
	memset(dis,0x3f,sizeof(dis));dis[s]=0;
	priority_queue<pii,vector<pii>,greater<pii> > que;
	que.push({0,s});
	while (!que.empty()){
		pii x=que.top();
		que.pop();
		if (x.first>dis[x.second])continue;
		for (int i=hd[x.second];i;i=ed[i].nxt){
			int y=ed[i].to;
			if (dis[y]>x.first+ed[i].val)
				dis[y]=x.first+ed[i].val,
				que.push({dis[y],y});
		}
	}
}
int main(){
	n=read(),m=read(),s=read(),tim=n;
	while ((1<<lnode)<=n)lnode++;lnode--;
	for (int i=1;i<=n;i++)fa[i]=i;
	while (m--){
		int opt=read();
		if (opt==1){
			int x=read(),y=read(),a=read(),b=read(),val=read();
			if (Getfa(x)!=Getfa(y)||Getfa(a)!=Getfa(b))continue;
			q[++totq]={x,y,a,b,val};
		}
		else{
			int x=read(),y=read(),a=Getfa(x),b=Getfa(y),val=read();
			if (a==b)continue;
			addt(x,y);
			addt(y,x);
			adde(x,y,val);
			adde(y,x,val);
			fa[a]=b;
		}
	}
	for (int i=1;i<=n;i++)
		if (!dep[i])
			dfs(i,0);
	for (int i=1;i<=totq;i++)
		lca1(q[i].x,q[i].y,++tim),
		lca2(q[i].a,q[i].b,++tim),
		adde(tim-1,tim,q[i].val);
	dijkstra(s);
	for (int i=1;i<=n;i++)write(dis[i]==INF?-1:dis[i],' ');
	return 0;
}
2023/5/3 21:26
加载中...