luoguP1137旅行計畫

2022-09-18 03:45:40 字數 1604 閱讀 2296

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

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

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

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

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

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

輸入5 6

1 21 3

2 32 4

3 42 5輸出1

2343

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

對於20%的資料,n ≤ 100

對於60%的資料,n ≤ 1000

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

#include namespace fastio 

void print() {}

inline int getc()

inline void flush()

templateinline void read(t &x, t2 &... oth)

while (isdigit(ch))

x = f ? -x : x;

read(oth...);

}templateinline void print(t x, t2... oth) while (x /= 10);

do while (--p);

buf2[++p3] = hh;

print(oth...);

}} // namespace fastio

#define read fastio::read

#define print fastio::print

//***********************************===

using namespace std;

const int maxn=1e5+10;

typedef long long ll;

int n,m;

struct nodee[maxn*2];

int head[maxn],d[maxn],a[maxn],tot,in[maxn],t;

inline void add(int u,int v)

inline void toposort()

}while (!q.empty()) }}

}int main()

toposort();

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

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

//***********************************===

fastio::flush();

return 0;

}

Luogu P1137 旅行計畫

可以發現,因為只能往東邊走,並且有入度為 0 的起點,因此這是乙個有向無環圖,可以進行拓撲排序,求出拓撲序列。那麼我們要拓撲序列怎麼做呢?由於拓撲序列中,前面的點總是後面的點的前驅,因此可以進行dp。而dp的狀態轉移方程也很明顯,這個城市只能由前面的城市轉移過來,因此有方程 dis v max di...

Luogu P1137 旅行計畫

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

P1137 旅行計畫

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