缩点后爆搜求剪枝
查看原帖
缩点后爆搜求剪枝
420505
A_sh楼主2021/10/21 09:27

RT

70pts已经改不动了

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,M=5e6+10;
int m,n;
int dfn[N],low[N],stk[N],tag[N],vis[N];
int l[N],r[N],ans[N];
int tim,cnt,tot,top;
struct node{
    int u,v,ne;
}e[M<<1],ee[M<<1];
int h[N];
void add(int x,int y){
    e[++cnt].u=x,e[cnt].v=y,e[cnt].ne=h[x],h[x]=cnt;
}
int max(int a,int b){
    return a>b?a:b;
}
int min(int a,int b){
    return a<b?a:b;
}
void tarjan(int x){
    dfn[x]=low[x]=++tim;
    stk[++top]=x;
    vis[x]=1;
    for(int i=h[x];i;i=e[i].ne){
        int y=e[i].v;
        if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}
        else if(vis[y])low[x]=min(low[x],dfn[y]);
    }
    if(dfn[x]==low[x]){
        int now;
        while(now=stk[top--]){
            vis[now]=0;
            tag[now]=x;
            if(now==x)break;
            l[x]=min(l[x],l[now]);
            r[x]=max(r[x],r[now]);
        }
    }
}
void dfs(int x,int fa){
    ans[1]=r[1]-l[1];
    for(int i=h[x];i;i=ee[i].ne){
        int y=ee[i].v;
        if(y!=fa){
            ans[y]=max(ans[y],max(max(ans[x],r[y]-l[x]),r[y]-l[y]));
            l[y]=min(l[x],l[y]);
            dfs(y,x);
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    int tmp;
    for(int i=1;i<=n;i++){
        scanf("%d",&tmp);
        l[i]=r[i]=tmp;
    }
    int x,y,z;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&z);
        add(x,y);
        if(z==2)add(y,x);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i])tarjan(i);
    }
    if(tag[1]==tag[n]){
        printf("%d",r[1]-l[1]);
        return 0;   
    }
    memset(h,0,sizeof(h));
    for(int i=1;i<=cnt;i++){
        int x=tag[e[i].u],y=tag[e[i].v];
        if(x!=y){
            ee[++tot].u=x;
            ee[tot].v=y;
            ee[tot].ne=h[x];
            h[x]=tot;
        }
    }
    dfs(1,0);
    int maxx=0;
    printf("%d",ans[tag[n]]);
    return 0;
}
2021/10/21 09:27
加载中...