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

2021-08-28 23:03:31 字數 1130 閱讀 4386

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

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

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

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

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

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

5 61 2

1 32 3

2 43 4

2 5123

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

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

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

應該還是一道比較明顯的拓撲排序的題目,因為各個城市之間如果連邊,那麼他們就相當於有嚴格的大小關係。

然後我們在建完圖後,就要在圖上跑乙個最長路,典型的拓撲排序。

對於每次入度為0的點,最長路肯定為1,因為沒有人能到達他,其他的依次更新即可。

#includeusing namespace std;

const int maxn=1e5+10;

const int maxm=4e5+10;

const int inf=0x3f3f3f3f;

int n,m,cnt,s;

int head[maxn],du[maxn],dis[maxn];

int nxt[maxm],to[maxm];

void add(int x,int y)

int main()

queueq;

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

while(!q.empty()) }

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

printf("%d\n",dis[i]);

return 0;

}

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

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

洛谷1137 旅行計畫 拓撲排序模板

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

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

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