P3387 模板 縮點

2022-09-17 08:54:10 字數 1959 閱讀 7035

縮點+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

題解:縮點+記憶化搜尋

1 #include2 #include 3 #include 4 #include 5 #include 6

using

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 計算到達這個強連通分量時的最大權值 感覺這裡...