洛谷 P1137 旅行計畫 (拓撲排序 dp)

2022-07-15 18:42:07 字數 1633 閱讀 5419

在dag中,拓撲排序可以確定dp的順序

把圖的資訊轉化到乙個拓撲序上

注意轉移的時候要用邊轉移

這道題的dp是用刷表法

#include#define rep(i, a, b) for(register int i = (a); i < (b); i++)

#define _for(i, a, b) for(register int i = (a); i <= (b); i++)

using

namespace

std;

const

int maxn = 1e5 + 10

;struct edge;

edge e[maxn

<< 1

];int

head[maxn], d[maxn];

inttopo[maxn], dp[maxn];

intn, m, cnt, tot;

void addedge(int

from, int

to);

head[

from] = tot++;

}void read(int&x)

while(isdigit(ch))

x *=f;

}void

toposort()

}}int

main()

toposort();

_for(i,

1, n) dp[i] = 1

; _for(i,

1, n)

}_for(i,

1, n) printf("

%d\n

", dp[i]);

return0;

}

還可以用記憶化搜尋

#include#define rep(i, a, b) for(register int i = (a); i < (b); i++)

#define _for(i, a, b) for(register int i = (a); i <= (b); i++)

using

namespace

std;

const

int maxn = 1e5 + 10

;struct edge;

edge e[maxn

<< 1

];int

head[maxn], dp[maxn];

intn, m, cnt, tot;

void addedge(int

from, int

to);

head[

from] = tot++;

}void read(int&x)

while(isdigit(ch))

x *=f;

}int dfs(int

u)

return

dp[u];

}int

main()

memset(dp, -1, sizeof

(dp));

_for(i,

1, n) printf("

%d\n

", dfs(i));

return0;

}

洛谷P1137 旅行計畫(拓撲排序 dp)

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

P1137 旅行計畫 拓撲排序

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

P1137 旅行計畫 拓撲排序

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