P1137 旅行計畫

2021-09-07 14:28:55 字數 2955 閱讀 8591

小明要去乙個國家旅遊。這個國家有n個城市,編號為1~n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。

所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多。

現在,你只知道每一條道路所連線的兩個城市的相對位置關係,但並不知道所有城市具體的位置。現在對於所有的i,都需要你為小明制定一條路線,並求出以城市i為終點最多能夠遊覽多少個城市。

輸入格式:

輸入的第1行為兩個正整數n, m。

接下來m行,每行兩個正整數x, y,表示了有一條連線城市x與城市y的道路,保證了城市x在城市y西面。

輸出格式:

輸出包括n行,第i行包含乙個正整數,表示以第i個城市為終點最多能遊覽多少個城市。

輸入樣例#1:

5 6

1 21 3

2 32 4

3 42 5

輸出樣例#1:

123

43

均選擇從城市1出發可以得到以上答案。

對於20%的資料,n ≤ 100;

對於60%的資料,n ≤ 1000;

對於100%的資料,n ≤ 100000,m ≤ 200000。

方法一:

拓撲結構+簡單dp(其實可以邊拓撲邊dp)

1、用棧實現拓撲結構,找出拓撲序列

2、在這個拓撲序列的基礎上,找所有i節點西邊的點中經過城市最多的點+1,就是i對應的答案

個人感覺verctor陣列存圖要比陣列模擬鍊錶存圖方便很多。

1 #include2 #include3 #include4

using

namespace

std; 56

int n,m,x,y,ru[100001],ans[100001

];

7 vector ro[100001

],tot;

8 stackq; 910

intmain()

11

22//

下面是拓撲排序,用棧實現,其實和佇列實現差不多

23//

如果入度為0,入棧,對應的答案為1

24for(int i=1;i<=n;i++)

25if(!ru[i]) q.push(i),ans[i]=1

; 26

//當q中還有元素的時候

27while(!q.empty())

28

38}

39//

遍歷這n個點,簡單dp

40for(int i=0;i)

41

50}

51for(int i=1;i<=n;i++) printf("

%d\n

",ans[i]);

52return

0;

53 }

方法二:

棧實現spfa

1、找到起點

2、從起點處做spfa,用出棧的點去更新別的所有點

1 #include2 #include3 #include4 #include5

using

namespace

std;

6#define maxm 200010

7int n,m,ans,num,head[maxm],dp[100010],ru[100010

];8 stackq;

9bool vis[100010

];10

//邊

11struct

nodee[maxm];

14//

陣列模擬鍊錶

15void insert(int

from,int

to)20

void

spfa()36}

37}38}

39}40//

讀數 41

intqread()

46return

i;47}48

intmain()

60//

遍歷n個節點,將空節點先入棧

61for(int i=1;i<=n;i++)68}

69//

做spfa

70spfa();

71for(int i=1;i<=n;i++)printf("

%d\n

",dp[i]);

72 }

方法三:

記憶化搜尋

這個題只能向一邊走而不能走環,所以滿足無後效性原理,顯然可以動態規劃,一般題目顯然搜尋比較好(ˇˍˇ) 想;但是搜尋往往會是指數級別的時間複雜度,這個題的最後幾組資料顯然不支援指數級別的演算法,但是記憶化搜尋可以滿足需求,就是記憶每一次搜尋的結果,可以很快速的完成搜尋,而且記憶化搜尋的時間複雜度和動歸理論上是一樣的,於是很多動歸題目實在想不出來都可以記憶化搜尋,有時還能減支優化。

1 #include2 #include3 #include4 #include5 #include6

#define maxn 400010

7using

namespace

std;

8 vectorl[maxn];

9int n,m,u[maxn],v[maxn],dp[maxn],cnt=1;10

void add(int x,int

y)11

16int dfs(int

x)17

31return

dp[x];32}

33int

main()

3445

//記憶化搜尋

46for(i=1;i<=n;i++)

47 cout48return0;

49 }

P1137 旅行計畫

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

P1137 旅行計畫

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

P1137 旅行計畫

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