縮點+dp
給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。
允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。
輸入格式:
第一行,n,m
第二行,n個整數,依次代表點權
第三至m+2行,每行兩個整數u,v,表示u->v有一條有向邊
輸出格式:
共一行,最大的點權之和。
輸入樣例#1:
2 21 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 } kma縮點之後很明顯是個dag,跑一遍toposort順便dp 方程 ans v max ans u w v ans v ans是到這個連通塊的最大點權和,w是這個連通塊的點權 注意縮點之後兩個連通塊之間可能會有很多邊,從連通塊內不同的點發出,正反分別只能連一次,否則toposort會涼 inclu... 題目鏈結 縮點 dp 給定乙個 n 個點 m 條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。第一行,n m 第二行,n 個整數,依次代表點權 第三至 m 2 行,每行兩個整數 u v 表... 給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。第一行,n,m。第二行,n個整數,依次代表點權。第三至m 2行,每行兩個整數u,v,表示u v有一條有向邊。共一行,最大的點...洛谷P3387 模板 縮點
洛谷P3387 (模板)縮點
縮點 洛谷P3387