20分求助
查看原帖
20分求助
195705
李湛然楼主2021/8/4 20:34
#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
const int N=100005;
const int M=500005;
int n,m;
int price[N];
int fx[N];
int head[2*N];
int nxt[2*M];
int to[2*M];
int tot=0;
int dfn[N];
int low[N];
int num=0;
int co[N];
int col=0;
int sz[N];
int mix[N];//2e9!!!;
int mx[N];//0!!!
queue<int> q;
stack<int> s;
int in[2*N];
inline void add(int x,int y)
{
    nxt[++tot]=head[x];
    head[x]=tot;
    to[tot]=y;
    return ;
}
void tarjan(int x)
{
    num++;
    dfn[x]=low[x]=num;
    s.push(x);
    for(int i=head[x];i;i=nxt[i])
    {
        int v=to[i];
        if(!dfn[v])
        {
            tarjan(v);
            low[x]=min(low[x],low[v]);
        }
        else
        {
            if(!co[v])
                    low[x]=min(low[x],dfn[v]);
        }
    }
    if(low[x]==dfn[x])
    {
        co[x]=++col;
        ++sz[col];
        mix[col]=min(mix[col],price[x]);
        mx[col]=max(mx[col],price[x]);
        while(s.top()!=x)
        {
            ++sz[col];
            co[s.top()]=col;
            mix[col]=min(mix[col],price[s.top()]);
            mx[col]=max(mx[col],price[s.top()]);
            s.pop();
        }
        s.pop();
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&price[i]);
        mix[i]=2e9;
        //mx[i]=0;
    }
    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);
    }
    tarjan(1);
    for(int i=1;i<=n;i++)
    {
        for(int j=head[i];j;j=nxt[j])
        {
            if(co[i]!=co[to[j]])
            {
                in[co[to[j]]+n]++;
                add(co[i]+n,co[to[j]]+n);
            }

        }
    }
    for(int i=n+1;i<=n+col;i++)
    {
        if(!in[i])
        {
            q.push(i);
            //cout<<i<<endl;
           // cout<<"yesri"<<endl;
            fx[i-n]=mix[i-n];
        }
    }
    int ans=0;
    while(!q.empty())
    {
        int a=q.front();
        q.pop();
        //cout<<a<<endl;
        for(int i=head[a];i;i=nxt[i])
        {
                //cout<<"fuckyou"<<endl;
            int y=to[i];
            in[y]--;
            fx[y-n]=min(fx[a-n],mix[y-n]);
                  //cout<<y<<" "<<fx[y]<<endl;
            ans=max(ans,mx[y-n]-fx[y-n]);
            if(in[y]==0)
            {
                q.push(y);
            }
        }
    }
    cout<<ans;
    return 0;
}

2021/8/4 20:34
加载中...