kma縮點之後很明顯是個dag,跑一遍toposort順便dp
方程\(ans[v] = max(ans[u] + w[v], ans[v])\),ans是到這個連通塊的最大點權和,w是這個連通塊的點權
注意縮點之後兩個連通塊之間可能會有很多邊,從連通塊內不同的點發出,正反分別只能連一次,否則toposort會涼
#include #define n (100000 + 10)
using namespace std;
inline int read()
while (isdigit(c))
return cnt * f;
}int n, m, x, y, to[n], first[n], nxt[n], tot, sta[n], insta[n], w[n], v[n], id[n];
int nxt_[n], first_[n], to_[n], tot_, in[n], low[n], dfn[n], sign, top, cnt;
int ans[n], gmax, fa[n];
int get_father(int x)
inline void add(int x, int y)
inline void add_(int x, int y)
void tarjan(int u) while(u != sta[top--]);
}}inline void toposort()
}}int main()
register int *t = fa + 1; for (;t <= fa + cnt + 1;)
for (register int i = 1; i <= n; ++i)
for (register int j = first[i]; j; j = nxt[j])
}toposort();
printf("%d", gmax);
return 0;
}
模板 縮點 洛谷p3387
縮點 dp 給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。輸入格式 第一行,n,m 第二行,n個整數,依次代表點權 第三至m 2行,每行兩個整數u,v,表示u v有一條有...
洛谷P3387 (模板)縮點
題目鏈結 縮點 dp 給定乙個 n 個點 m 條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。第一行,n m 第二行,n 個整數,依次代表點權 第三至 m 2 行,每行兩個整數 u v 表...
縮點 洛谷P3387
給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。第一行,n,m。第二行,n個整數,依次代表點權。第三至m 2行,每行兩個整數u,v,表示u v有一條有向邊。共一行,最大的點...