1. 程式人生 > >洛谷P1137 旅行計劃

洛谷P1137 旅行計劃

++ 旅遊 har space include etc efi main read

P1137 旅行計劃

題目描述

小明要去一個國家旅遊。這個國家有N個城市,編號為1~N,並且有M條道路連接著,小明準備從其中一個城市出發,並只往東走到城市i停止。

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

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

輸入輸出格式

輸入格式:

輸入的第1行為兩個正整數N, M。

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

輸出格式:

輸出包括N行,第i行包含一個正整數,表示以第i個城市為終點最多能遊覽多少個城市。

輸入輸出樣例

輸入樣例#1:
5 6
1 2
1 3
2 3
2 4
3 4
2 5
輸出樣例#1:
1
2
3
4
3

說明

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

對於20%的數據,N ≤ 100;

對於60%的數據,N ≤ 1000;

對於100%的數據,N ≤ 100000,M ≤ 200000。

技術分享
#include<iostream>
#include
<cstdio> #include<cstring> #include<queue> using namespace std; #define maxm 200010 int n,m,ans,num,head[maxm],dp[100010],ru[100010]; queue<int>q; bool vis[100010]; struct node{ int pre,to; }e[maxm]; void Insert(int from,int to){ e[++num].to=to; e[num].pre=head[from]; head[
from]=num; } void spfa(){ while(!q.empty()){ int point=q.front();q.pop();vis[point]=0; for(int i=head[point];i;i=e[i].pre){ int to=e[i].to; if(dp[to]<dp[point]+1){ dp[to]=dp[point]+1; if(!vis[to]){ vis[to]=1; q.push(to); } } } } } int qread(){ int i=0; char ch=getchar(); while(ch<0||ch>9)ch=getchar(); while(ch<=9&&ch>=0){i=i*10+ch-0;ch=getchar();} return i; } int main(){ n=qread();m=qread(); int x,y; for(int i=1;i<=m;i++){ x=qread();y=qread(); Insert(x,y); ru[y]++; } for(int i=1;i<=n;i++){ if(ru[i]==0){ q.push(i); vis[i]=1; dp[i]=1; } } spfa(); for(int i=1;i<=n;i++)printf("%d\n",dp[i]); }
80分 spfa TLE

洛谷P1137 旅行計劃