求助!本机#3正确,但上交错误
查看原帖
求助!本机#3正确,但上交错误
544458
WAI_kycm楼主2024/2/26 20:51
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int n, m, ans, a[maxn];
struct Node {int to, next, from;} e[maxn], e2[maxn];
int len, head[maxn], len2, head2[maxn];
void Insert(int u, int v, int &len, int head[], Node e[]) {e[++len].to = v; e[len].from = u; e[len].next = head[u]; head[u] = len;}
int top, cnt, Time, q[maxn], dfn[maxn], low[maxn], vis[maxn], siz_min[maxn], siz_max[maxn], belong[maxn];
void Tarjan(int u){
    dfn[u] = low[u] = ++Time; vis[u] = 1; q[++top] = u;
    for(int i = head[u]; i; i = e[i].next){
        int v = e[i].to;
        if(!dfn[v]){
            Tarjan(v);
            low[u] = min(low[u], low[v]);
        }else if( vis[v]) low[u] = min(low[u], dfn[v]);
    }
    if(low[u] == dfn[u]){
        ++cnt;
        while(q[top + 1] != u){
            int v = q[top--];
            belong[v] = cnt; vis[v] = 0;
            siz_min[cnt] = min(siz_min[cnt], a[v]); siz_max[cnt] = max(siz_max[cnt], a[v]);
        }
    }
}
int dp[maxn][5];
void dfs(int u){
    if( dp[u][1]) return;
    if(u == belong[n]) dp[u][2] = 1;
    dp[u][1] = siz_max[u];
    for(int i = head2[u]; i; i = e2[i].next){
        int v = e2[i].to;
        dfs(v);
        if( dp[v][2]) dp[u][1] = max(dp[u][1], dp[v][1]), ans = max(ans, dp[u][1] - siz_min[u]);
    }
}
void Solve(){
    memset(siz_min, 0x3f, sizeof siz_min);
    cin>>n>>m;
    for(int i = 1; i <= n; ++i) cin>>a[i];
    for(int i = 1; i <= m; ++i) {int u, v, opt; cin>>u>>v>>opt; Insert(u, v, len, head, e); if(opt == 2) Insert(v, u, len, head, e);}
    Tarjan(1);
    for(int i = 1; i <= len; ++i){
        int u = belong[e[i].from], v = belong[e[i].to];
        if(u != v) Insert(u, v, len2, head2, e2);
    }
    dfs(belong[1]);
    cout<<ans<<endl;
}
int main(){
    Solve();
    return 0;
}

/*
第三个测试点
2 1
1 100
1 2 1

99
*/
2024/2/26 20:51
加载中...