Tarjan有向缩点求助!!
查看原帖
Tarjan有向缩点求助!!
519573
Daniel_yao楼主2024/5/4 15:11

复健失败,dalao求调!!

#include <bits/stdc++.h>
#define int long long
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007

using namespace std;

inline int read() {
  rint x=0,f=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  return x*f;
}

void print(int x){
  if(x<0){putchar('-');x=-x;}
  if(x>9){print(x/10);putchar(x%10+'0');}
  else putchar(x+'0');
  return;
}

const int N = 1e5 + 10;

struct Node {
  int u, v, nx;
} e[N], E[N], EE[N];

int n, m, h[N], H[N], tot, TOT, w[N], dfn[N], low[N], stk[N], top, tim, id[N], in[N], dp[N];

bool instk[N];

void add(int u, int v) {
  e[++tot] = (Node){u, v, h[u]};
  h[u] = tot;
}

void Add(int u, int v) {
  EE[++TOT] = (Node){u, v, H[u]};
  H[u] = TOT;
}

void tarjan(int x) {
  dfn[x] = low[x] = ++tim;
  stk[++top] = x;
  instk[x] = 1;
  for (int i = h[x]; i; i = e[i].nx) {
    int y = e[i].v;
    if(!dfn[y]) {
      tarjan(y);
      low[x] = min(low[x], low[y]);
    } else if(instk[y]) {
      low[x] = min(low[x], dfn[y]); 
    } 
  }
  if(dfn[x] == low[x]) {
    int y;
    while(1) {
      y = stk[top--];
      instk[y] = 0;
      id[y] = x;
      if(x == y) break;
      w[x] += w[y];
    }
  }
}

int topu() {
  queue<int> q;
  For(i,1,n) {
    if(!in[i] && id[i] == i) q.push(i), dp[i] = w[i]; 
  }
  while(!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = H[x]; i; i = EE[i].nx) {
      int y = EE[i].v;
      dp[y] = max(dp[y], dp[x] + w[y]);
      if(!(--in[y])) q.push(y);
    }
  }
  int ans = 0;
  For(i,1,n) ans = max(ans, dp[i]);
  return ans;
}

signed main() {
  n = read(), m = read();
  For(i,1,n) w[i] = read(); 
  For(i,1,m) {
    int u, v;
    u = read(), v = read();
    E[i].u = u, E[i].v = v;
    add(u, v);
  }
  For(i,1,n) if(!dfn[i]) tarjan(i);
  For(i,1,m) {
    if(id[E[i].u] != id[E[i].v]) {
      Add(E[i].u, E[i].v);
      in[E[i].v] ++;
    }
  }
  cout << topu() << '\n';
  return 0;
}

2024/5/4 15:11
加载中...