旅行計畫 拓撲排序 領接表

2021-09-23 15:33:41 字數 1587 閱讀 5947

>description

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

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

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

>input

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

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

>output

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

>sample input

5 61 2

1 32 3

2 43 4

2 5>sample output12

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

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

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

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

>解題思路先把圖拓撲排序一下,然後dp:f[i]表示以第i個城市為終點最多能遊覽多少個城市。

狀態轉移方程:f[i]=max(f[j]+1),f[j]表示與f[i]相連的點(j->i)

>**

#include

#include

using namespace std;

struct ooo

a[200005];

int n,m,x,y,tt,h[

100005

],f[

100005

],r[

100005

],st[

100005

],head,tail;

int main()

for(int i=

1;i<=n;i++)if

(!r[i]

) st[

++tail]

=i;//把入度為0的加入佇列

while

(head}for

(int i=

1;i<=n;i++

)for

(int j=h[st[i]

];j;j=a[j]

.next)

f[a[j]

.to]

=max

(f[a[j]

.to]

,f[st[i]]+

1);//dp

for(int i=

1;i<=n;i++

)printf

("%d\n"

,f[i]+1

);//還要加上開始的那乙個點

return0;

}

P1137 旅行計畫 拓撲排序

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

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

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

P1137 旅行計畫 拓撲排序

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