P1137 旅行計畫

2021-10-09 06:48:52 字數 1777 閱讀 4842

p1137 旅行計畫

題目描述

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

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

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

輸入格式

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

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

輸出格式

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

輸入輸出樣例

輸入

561

2132

3243

425

輸出

123

43

說明/提示

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

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

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

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

思路:

通俗的說就是,一張有向無環圖的拓撲序可以使得任意的起點u,它的乙個終點v,在序列中的順序是u在前v在後

仔細看dp部分,還記得dp需要滿足什麼原則嗎?無後效性。如果不是在拓撲序後進行dp,會完全破壞無後效性。正是因為拓撲序u在前,v在後的性質,這才選擇使用拓撲排序,畢竟它的**實現很輕鬆,而且執行時間也不差。

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);

using

namespace std;

const

int max=

2147483647

;const

int n=

1e5+10;

struct node

edge[

2*n]

;int n,m,u,v,in[n]

,head,tail,que[n]

,hd[n]

,tot,f[n]

;bool vis[n]

;void

add(

int x,

int y)

;hd[x]

=tot;

}void

topsort()

}}}int

main()

for(

int i=

1;i<=n;i++

)printf

("%d\n"

,f[i]+1

);return0;

}

P1137 旅行計畫

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

P1137 旅行計畫

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

P1137 旅行計畫

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