簡單DP 拓撲排序 拓撲排序 DP兩練

2021-10-23 14:16:47 字數 1872 閱讀 7484

portkey

單源單匯就是最長路

多源單匯就是反一下最長路

多源多匯就是拓撲排序

#include

using

namespace std;

#define in read()

int in

const

int n=

2e5+5;

int n,m,deg[n]

,f[n]

;vector<

int>g[n]

;void

topo()

}return;}

intmain()

topo()

;for

(int i=

1;i<=n;

++i)

printf

("%d\n"

,f[i]);

return0;

}

portkey

考察最後圖的性質:dag

聯想到拓排

拓排要求dag,如果在排的時候強行整成dag呢

是可以的

於是按有向邊拓排

遇到無向邊將它改造為從這個點出發的有向邊

一通暴搞下來得到的就是dag

題目的

資料保證一開始就有的單向道路中

就很優秀

而且保證有解

#include

using

namespace std;

#define in read()

#define int long long

int in

const

int n=

2e5+5;

int n,m1,m2;

int tot,first[n]

,nxt[n]

,aim[n]

,wei[n]

,ori[n]

;int deg[n]

;queue<

int>q;

void

ljb(

int u,

int v,

int w)

signed

main()

for(

int i=

1;i<=n;

++i)if(

!deg[i]

) q.

push

(i);if(

!(tot&1)

)++tot;

for(

int i=

1;i<=m2;

++i)

while

(!q.

empty()

)for

(int e=first[u]

;e;e=nxt[e])if

(wei[e]==1

) wei[e^1]

=2;}

for(

int i=

1;i<=n;

++i)

if(deg[i]

)bool flag=

false

;for

(int i=

1;i<=tot;

++i)

if(wei[i]==1

)printf

("%lld %lld\n"

,ori[i]

,aim[i]

),flag=

true;if

(!flag)

puts

("-1");

return0;

}

這第10個點。。。

invalid answer

不會了交題解

拓撲排序 DP 旅遊計畫

luogu p1137 小明要去乙個國家旅遊。這個國家有 n個城市,編號為1到n,並且有mm條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希...

D Substring 思維 拓撲排序dp

思路 開始看錯題目是無向圖,莽了一手暴力發現題意理解錯誤。通過拓撲排序後就可以轉移到達每個點的字元的最大次數是多少。o 26n 轉移是每次遍歷到的時候更新。入queue是度數為0 include include include include include include include incl...

Hrbust 1493 交通 拓撲排序 Dp

交通 time limit 1000 ms memory limit 65535 k total submit 47 15 users total accepted 18 12 users rating special judge no description 乙個農場主有一塊草地和一些奶牛,因為在...