rt 求条
tarjan 缩点+树剖又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;
}