縮點+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
題解:縮點+記憶化搜尋
1 #include2 #include 3 #include 4 #include 5 #include 6using
namespace
std;78
const
int maxn=1e5+10;9
const
int inf=0x3f3f3f3f;10
struct
nodeedge[maxn*4
];14
inthead[maxn];
15int
val[maxn];
16bool
instack[maxn];
17int
cnt;
18int
dfn[maxn],low[maxn];
19int
sum[maxn];
20void add(int x,int
y)21
26int
time,num;
27 stackst;
28 vectorg[maxn];
29int
du[maxn];
30int
color[maxn];
31int
x[maxn],y[maxn];
32int
f[maxn];
33void search(int
x)34
42 f[x]+=maxsum;
4344}45
void tarjan(int
u)46
56else
if(instack[v]) low[u]=min(low[u],dfn[v]);57}
58if(dfn[u]==low[u])
596970}
71}7273
intmain()
7480 cnt=0
;81 memset(head,-1,sizeof
(head));
82 memset(instack,false, sizeof
(instack));
83 memset(sum, 0,sizeof
(sum));
84for (int i = 1; i <=m ; ++i)
88for (int i = 1; i <=n ; ++i)
91for (int i = 1; i <=n ; ++i)
94for (int k = 1; k <=num ; ++k)
97for (int i = 1; i <=m ; ++i)
102}
103for (int i = 1; i <=num; ++i)
107}
108109
int ans=0
;110
for (int i = 1; i <=num ; ++i)
115}
116 printf("
%d\n
",ans);
117return0;
118 }
P3387 模板 縮點
r es ul tresult result h yp erli nk hyperlink hyperl ink de scri ptio ndescription descri ptio n 給定一張n nn個點,m mm條邊的有向圖,點有點權 找出一條路徑使得經過的點的權值和最大,點和邊可以重複...
P3387 模板 縮點
縮點 dp 給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。輸入格式 第一行,n,m 第二行,n個整數,依次代表點權 第三至m 2行,每行兩個整數u,v,表示u v有一條有...
P3387 模板 縮點
題解 qwq論這個題我開了多少陣列qwq 因為每個點走過多次權值只會計算1次 簡化問題 把題目給出的有向圖縮點,成為有向無環圖,然後拓撲排序跑最長路 首先tarjan縮點 然後強連通分量連邊 下面跑拓撲排序,入度為0的強連通分量 first 然後 dis 計算到達這個強連通分量時的最大權值 感覺這裡...