求条
查看原帖
求条
1246763
ny_WYR楼主2025/1/27 22:14

rt 求条
tarjantarjan 缩点+树剖又WA又MLE,讨论区的hack目前都能过。 请哪位dalao帮助一下,谢谢!
提交记录

#include<bits/stdc++.h>
using namespace std;
int const N=5e5+5;
int const M=1e6+5;
int h[N],h2[N];
struct edge{
	int t,w,next;
}e[M<<1],e2[M<<1];
int n,m,idx;
void init(int x,int h[]){
	for(int i=1;i<=x;i++) h[i]=-1;
}
void add(int f,int t,int w,edge e[],int h[]){
	e[idx].t=t;
	e[idx].w=w;
	e[idx].next=h[f];
	h[f]=idx++;
}
int dfn[N],low[N],tot;
int id[N],cnt;
bool bridge[M<<1];
void tarjan(int u,int fa){
	dfn[u]=low[u]=++tot;
	for(int i=h[u];~i;i=e[i].next){
		int v=e[i].t;
		if(!dfn[v]){
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>dfn[u]){
				bridge[i]=bridge[i^1]=true;
 			}
		}
		else if(v!=fa){
			low[u]=min(low[u],dfn[v]);
		}
	}
}
void DFS(int u,int p){
	id[u]=cnt;
	for(int i=h[u];~i;i=e[i].next){
		int v=e[i].t;
		if(v==p||bridge[i]) continue;
		DFS(v,u);
	}
}
bool vis[M];
struct Edge{
	int f,t,w;
}E[M];
int tmp;
bool cmp(Edge a,Edge b){
	return a.w<b.w;
}
int L,R;
int res=-1;
int dfn2[N],sz[N],d[N];
int tot2;
int fa[N],son[N],top[N];
void dfs(int u,int p){
	d[u]=d[p]+1;
	fa[u]=p;
	sz[u]=1;
	int MAX=0;
	for(int i=h2[u];~i;i=e2[i].next){
		int v=e2[i].t;
		if(v==p) continue;
		dfs(v,u);
		sz[u]+=sz[v];
		if(sz[v]>MAX){
			MAX=sz[v];
			son[u]=v;
		}
	}
}
void dfss(int u,int p,int tp){
	dfn2[u]=++tot2;
	top[u]=tp;
	if(son[u]) dfss(son[u],u,tp);
	for(int i=h2[u];~i;i=e2[i].next){
		int v=e2[i].t;
		if(v==p||v==son[u]) continue;
		dfss(v,u,v);
	}
}
int c[N];
int lowbit(int x){
	return x&(-x);
}
void update(int x,int k){
	for(int i=x;i<=cnt;i+=lowbit(i)) c[i]+=k;
}
int getsum(int x){
	int sum=0;
	for(int i=x;i>0;i-=lowbit(i))
		sum+=c[i];
	return sum;
}
void modify(int x,int y){
	while(top[x]!=top[y]){
		if(d[top[x]]<d[top[y]]) swap(x,y);
		update(top[x],1);
		update(x+1,-1);
		x=fa[top[x]];
	}
	if(d[x]<d[y]) swap(x,y);
	update(y,1);
	update(x+1,-1);
}
int lca(int x,int y){
	while(top[x]!=top[y]){
		if(d[top[x]]<d[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	if(d[x]<d[y]) swap(x,y);
	return y;
}
int main(){
	scanf("%d%d",&n,&m);
	init(n,h);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w,e,h);
		add(v,u,w,e,h);
	} 
	tarjan(1,-1);
	for(int i=1;i<=n;i++){
		if(!id[i]){
			cnt++;
			DFS(i,-1);
		}
	}
	init(cnt,h2);
	idx=0;
	for(int i=1;i<=n;i++){
		for(int j=h[i];~j;j=e[j].next){
			int v=e[j].t,w=e[j].w;
			if(id[i]!=id[v]&&!vis[j]&&!vis[j^1]){
				E[++tmp].f=id[i];
				E[tmp].t=id[v];
				E[tmp].w=w;
				vis[j]=vis[j^1]=true;
				add(id[i],id[v],w,e2,h2);
				add(id[v],id[i],w,e2,h2);
			}
		}
	}
	dfs(id[1],0);
	dfss(id[1],0,id[1]);
	sort(E+1,E+1+tmp,cmp);
	for(int i=1;i<=tmp;i++){
		if(i==1){
			L=E[i].f;
			R=E[i].t;
		}
		else{
			int u=E[i].f,v=E[i].t;
			if(getsum(dfn2[u])&&getsum(dfn2[v])) continue;
			else if((getsum(dfn2[u])||getsum(dfn2[v]))&&(u!=L&&u!=R&&v!=L&&v!=R)){
				res=E[i].w;
				break;
			}
			else{
				int LCA=lca(L,R);
				if(LCA==L){
					if(dfn2[R]<=dfn2[u]&&dfn2[u]<=dfn2[R]+sz[R]-1)
						R=d[u]>d[v]?u:v;
					else{
						int l1=lca(u,L);
						int l2=lca(v,L);
						if(abs(d[l1]-d[u])+abs(d[l1]-d[L])>abs(d[l2]-d[v])+abs(d[l2]-d[L]))
							L=u;
						else L=v;
					}
				}
				else if(LCA==R){
					if(dfn2[L]<=dfn2[u]&&dfn2[u]<=dfn2[L]+sz[L]-1)
						L=d[u]>d[v]?u:v;
					else{
						int l1=lca(u,R);
						int l2=lca(v,R);
						if(abs(d[l1]-d[u])+abs(d[l1]-d[R])>abs(d[l2]-d[v])+abs(d[l2]-d[R]))
							R=u;
						else R=v;
					}
				}
				else{
					if(dfn2[R]<=dfn2[u]&&dfn2[u]<=dfn2[R]+sz[R]-1)
						R=d[u]>d[v]?u:v;
					else if(dfn2[L]<=dfn2[u]&&dfn2[u]<=dfn2[L]+sz[L]-1)
						L=d[u]>d[v]?u:v;
				}
			}
		}
		modify(L,R);
	}
	printf("%d",res);
	return 0;
} 
2025/1/27 22:14
加载中...