time limit: 1 second
memory limit: 128 mb
【問題描述】
小明要去乙個國家旅遊。這個國家有n個城市,編號為1~n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。 所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多。 現在,你只知道每一條道路所連線的兩個城市的相對位置關係,但並不知道所有城市具體的位置。現在對於所有的i,都需要你為小明制定一條路線,並求出以城市i為終點最多能夠遊覽多少個城市。
【輸入格式】
輸入檔案plan.in的第1行為兩個正整數n, m。 接下來m行,每行兩個正整數x, y,表示了有一條連線城市x與城市y的道路,保證了城市x在城市y西面。
【輸出格式】
輸出檔案plan.out包括n行,第i行包含乙個正整數,表示以第i個城市為終點最多能遊覽多少個城市。
【資料規模】
對於20%的資料,n ≤ 100; 對於60%的資料,n ≤ 1000; 對於100%的資料,n ≤ 100000,m ≤ 200000。
sample input1
5 6
1 2
1 3
2 3
2 4
3 4
2 5sample output1
1 2
3 4
3【樣例說明】
均選擇從城市1出發可以得到以上答案。
【題目鏈結】:
【題解】
設f[i]為以i作為終點最多能訪問的城市個數;
因為有從西到東的規律(只能向東走);所以先找出最西邊的那些點(入度為0的點);
從那些點開始進行拓撲排序;在進行拓撲排序的時候進行dp搞一搞就可以了;
因為是最西邊的點,所以從那些點開始、最後一定能搞到所有點的正確答案(經過的城市最多);
寫記蒐會爆棧、而且不知道怎麼回事。。
【完整**】
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef pair pii;
typedef pairpll;
void rel(ll &r)
void rei(int &r)
const
int maxn = 1e5+100;
const
int maxm = 2e5+100;
const
int dx[9] = ;
const
int dy[9] = ;
const
double pi = acos(-1.0);
int n,m;
int f[maxn],du[maxn];
queue
dl;
vector
g[maxn];
int main()
rep1(i,1,n)
if (du[i]==0)
while (!dl.empty())}}
rep1(i,1,n)
printf("%d\n",f[i]);
return
0;}
P1137 旅行計畫
題目描述 小明要去乙個國家旅遊。這個國家有n個城市,編號為1 n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多...
洛谷1137 旅行計畫
題目描述 小明要去乙個國家旅遊。這個國家有n個城市,編號為1 n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多...
P1137 旅行計畫
小明要去乙個國家旅遊。這個國家有n個城市,編號為1 n,並且有m條道路連線著,小明準備從其中乙個城市出發,並只往東走到城市i停止。所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第乙個城市,每個城市都在路線前乙個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多。現在,你...