模板 縮點 洛谷p3387

2021-08-07 08:04:26 字數 1207 閱讀 7138

縮點+dp

給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。

允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。

輸入格式:

第一行,n,m

第二行,n個整數,依次代表點權

第三至m+2行,每行兩個整數u,v,表示u->v有一條有向邊

輸出格式:

共一行,最大的點權之和。

輸入樣例#1:

2 2

1 11 2

2 1

輸出樣例#1:

2

n<=10^4,m<=10^5,|點權|<=1000演算法:tarjan縮點+dagdp

#include

#include

#include

#include

#define f(i,l,r) for(i=(l);i<=(r);i++)

using namespace std;

const int maxn=10005,maxm=100005;

struct edgee[maxm<<1];

int n,m,head[maxn<<1],tot,w[maxn<<1],group[maxn],ne;

int dfn[maxn],low[maxn],times,inq[maxn];

stackq;

int ans,vis[maxn<<1],f[maxn<<1];

inline void add(int u,int v)

inline void tarjan(int u)

else if(inq[v]) low[u]=min(low[u],dfn[v]);

}if(dfn[u]==low[u])while(node!=u);}}

inline int dp(int u)

f[u]+=w[u];

vis[u]=1;

return f[u];

}int main()

f(i,1,m)

f(i,1,n)

f(i,1,n)

}f(i,n+1,ne)

cout

}

洛谷P3387 模板 縮點

kma縮點之後很明顯是個dag,跑一遍toposort順便dp 方程 ans v max ans u w v ans v ans是到這個連通塊的最大點權和,w是這個連通塊的點權 注意縮點之後兩個連通塊之間可能會有很多邊,從連通塊內不同的點發出,正反分別只能連一次,否則toposort會涼 inclu...

洛谷P3387 (模板)縮點

題目鏈結 縮點 dp 給定乙個 n 個點 m 條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。第一行,n m 第二行,n 個整數,依次代表點權 第三至 m 2 行,每行兩個整數 u v 表...

縮點 洛谷P3387

給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。第一行,n,m。第二行,n個整數,依次代表點權。第三至m 2行,每行兩個整數u,v,表示u v有一條有向邊。共一行,最大的點...