小明要去乙個國家旅遊。這個國家有n個城市,編號為1~n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。
所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多。
現在,你只知道每一條道路所連線的兩個城市的相對位置關係,但並不知道所有城市具體的位置。現在對於所有的i,都需要你為小明制定一條路線,並求出以城市i為終點最多能夠遊覽多少個城市。
輸入格式:
輸入的第1行為兩個正整數n, m。
接下來m行,每行兩個正整數x, y,表示了有一條連線城市x與城市y的道路,保證了城市x在城市y西面。
輸出格式:
輸出包括n行,第i行包含乙個正整數,表示以第i個城市為終點最多能遊覽多少個城市。
輸入樣例#1:
5 61 21 3
2 32 4
3 42 5
輸出樣例#1:
12343
均選擇從城市1出發可以得到以上答案。
對於20%的資料,n ≤ 100;
對於60%的資料,n ≤ 1000;
對於100%的資料,n ≤ 100000,m ≤ 200000。
方法一:
拓撲結構+簡單dp(其實可以邊拓撲邊dp)
1、用棧實現拓撲結構,找出拓撲序列
2、在這個拓撲序列的基礎上,找所有i節點西邊的點中經過城市最多的點+1,就是i對應的答案
個人感覺verctor陣列存圖要比陣列模擬鍊錶存圖方便很多。
1 #include2 #include3 #include4using
namespace
std; 56
int n,m,x,y,ru[100001],ans[100001
];
7 vector ro[100001
],tot;
8 stackq; 910
intmain()
11
22//
下面是拓撲排序,用棧實現,其實和佇列實現差不多
23//
如果入度為0,入棧,對應的答案為1
24for(int i=1;i<=n;i++)
25if(!ru[i]) q.push(i),ans[i]=1
; 26
//當q中還有元素的時候
27while(!q.empty())
28
38}
39//
遍歷這n個點,簡單dp
40for(int i=0;i)
41
50}
51for(int i=1;i<=n;i++) printf("
%d\n
",ans[i]);
52return
0;
53 }
方法二:
棧實現spfa
1、找到起點
2、從起點處做spfa,用出棧的點去更新別的所有點
1 #include2 #include3 #include4 #include5using
namespace
std;
6#define maxm 200010
7int n,m,ans,num,head[maxm],dp[100010],ru[100010
];8 stackq;
9bool vis[100010
];10
//邊
11struct
nodee[maxm];
14//
陣列模擬鍊錶
15void insert(int
from,int
to)20
void
spfa()36}
37}38}
39}40//
讀數 41
intqread()
46return
i;47}48
intmain()
60//
遍歷n個節點,將空節點先入棧
61for(int i=1;i<=n;i++)68}
69//
做spfa
70spfa();
71for(int i=1;i<=n;i++)printf("
%d\n
",dp[i]);
72 }
方法三:
記憶化搜尋
這個題只能向一邊走而不能走環,所以滿足無後效性原理,顯然可以動態規劃,一般題目顯然搜尋比較好(ˇˍˇ) 想;但是搜尋往往會是指數級別的時間複雜度,這個題的最後幾組資料顯然不支援指數級別的演算法,但是記憶化搜尋可以滿足需求,就是記憶每一次搜尋的結果,可以很快速的完成搜尋,而且記憶化搜尋的時間複雜度和動歸理論上是一樣的,於是很多動歸題目實在想不出來都可以記憶化搜尋,有時還能減支優化。
1 #include2 #include3 #include4 #include5 #include6#define maxn 400010
7using
namespace
std;
8 vectorl[maxn];
9int n,m,u[maxn],v[maxn],dp[maxn],cnt=1;10
void add(int x,int
y)11
16int dfs(int
x)17
31return
dp[x];32}
33int
main()
3445
//記憶化搜尋
46for(i=1;i<=n;i++)
47 cout48return0;
49 }
P1137 旅行計畫
題目描述 小明要去乙個國家旅遊。這個國家有n個城市,編號為1 n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多...
P1137 旅行計畫
p1137 旅行計畫 題目描述 小明要去乙個國家旅遊。這個國家有n個城市,編號為1至n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下...
P1137 旅行計畫
小明要去乙個國家旅遊。這個國家有n個城市,編號為1 n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多。現在,你...