>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為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多。現在,你...